Забудьте обо всех ответах, которые говорят вам об объявлении атрибутов или обновлении изменяемых объектов в каждом рекурсивном вызове. В истинном функциональном, рекурсивном стиле вы «сохраняете» информацию, передавая ее как параметры и/или возвращаемые типы.
Позвольте мне проиллюстрировать простым примером, скажем, что вы хотите рекурсивно вычислить сумму элементов в int[]
. Здесь состояние (информация, которая должна быть сохранена между рекурсивными вызовами) является текущим индексом в массиве и суммой.Вот как это сделать:
public int sum(int[] array) {
return sum(array, 0, 0);
}
private int sum(int[] array, int idx, int acc) {
if (idx == array.length)
return acc;
return sum(array, idx+1, acc+array[idx]);
}
Зова это следующим образом:
int[] array = {1, 2, 3};
System.out.println(sum(array));
Как вы можете видеть, что нет необходимости объявлять (статической или экземпляр) атрибуты, и нет необходимости передавать и изменять изменяемым объекты (списки, карты). Я даже не использую локальные переменные, потому что вся необходимая информация, необходимая для решения проблемы, присутствует как параметры метода.
В коде вашего вопроса переменная v
должна выполнять то, что делает в моем ответе параметр acc
, а именно: изменение накопленного значения каждый раз, когда вызывается рекурсия. В итоге вам просто нужно вернуть накопленное значение из вспомогательной функции (которая не должна иметь возвращаемый тип void
), и именно так вы получите значение в foo()
.
Итак, статическая переменная - единственный способ использования рекурсии? – user1220022
@ user1220022 абсолютно нет, использование атрибутов для хранения состояния во время рекурсии (вообще) не требуется. Взгляните на мой ответ, я использую только параметры для отслеживания состояния и не используются переменные. –