Java Как вернуть размер списка с помощью рекурсивной функции - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь вернуть размер списка с помощью рекурсивной функции без использования .size ().

 public static int listSize(ArrayList<Integer> lst){
    if (lst.isEmpty()){
        return 0;
    }
    return 1 + listSize(lst.remove(0));
}

Это то, что я пытался сделать. При запуске этого кода я получаю сообщение об ошибке .remove (0) не работает вообще. Почему .remove (0) не работает в этом коде?

Ответы [ 4 ]

2 голосов
/ 22 октября 2019
lst.remove(0) 

удаляет нулевой элемент списка, но не возвращает список, он возвращает удаленный элемент.

Так что вместо этого вам нужно сделать что-то вроде

lst.remove(0);
return 1 + listSize(lst);

Одна очень важная вещь, которую нужно иметь в виду - вы «уничтожаете» список, передаваемый этому методу. Это не то, что можно ожидать при вызове метода с именем listSize() - вы ожидаете, что два вызова этого метода (без промежуточных изменений в списке) вернут одно и то же значение.

1 голос
/ 22 октября 2019

Может быть

 public static int listSize(ArrayList<Integer> lst){
    if (lst.isEmpty()){
        return 0;
    }
    return 1 + listSize(lst.subList(1, lst.size()));
}
1 голос
/ 22 октября 2019

Вы просто делаете это неправильно. List.remove () не возвращает список.

      List<Integer> a = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
      System.out.println(listSize(a));


   public static int listSize(List<Integer> lst) {
      if (lst.isEmpty()) {
         return 0;
      }
      lst.remove(0);
      return 1 + listSize(lst);
   }

А вот версия, которая восстанавливает список, возвращая элементы в правильном порядке.

   public static int listSize(List<Integer> lst) {
      int b;
      if (lst.isEmpty()) {
         return 0;
      }
      b = lst.remove(0);
      int v = 1 + listSize(lst);
      lst.add(0, b);
      return v;
   }
0 голосов
/ 22 октября 2019

Чтобы избежать побочных эффектов, можно выполнять клонирование списка при выполнении операций

import java.util.*;
public class Main
{
    public static void main(String[] args) {
        System.out.println("Hello World");
        ArrayList<Integer> integerList = new ArrayList();
        integerList.add(1);
        integerList.add(1);
        integerList.add(1);
        integerList.add(1);
        integerList.add(1);
        integerList.add(1);
        System.out.println("Length:: " + findListSizeByRecursion(integerList));

    }

    public static int findListSizeByRecursion(ArrayList<Integer> arrayList){
        List<Integer> clonedArrayList = (List<Integer>) arrayList.clone();
        if (clonedArrayList.isEmpty()){
            return 0;
        }
        clonedArrayList.remove(0);
        return 1 + findListSizeByRecursion((ArrayList<Integer>) clonedArrayList);
    }
}
...