Olvídate de todas las respuestas que te dicen que declares atributos, o para actualizar objetos mutables en cada llamada recursiva. En un verdadero estilo funcional y recursivo, usted "conserva" la información pasándola como parámetros y/o tipos de devolución.
Déjenme ilustrar con un ejemplo simple, digamos que desea calcular recursivamente la suma de los elementos en un int[]
. Aquí, el estado (la información que debe conservarse entre llamadas recursivas) es el índice actual en la matriz y la suma hasta el momento.He aquí cómo hacerlo:
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]);
}
llamada así:
int[] array = {1, 2, 3};
System.out.println(sum(array));
Como se puede ver, no hay necesidad de declarar (estática o instancia) atributos, y no hay necesidad de aprobar y modificar mutable objetos (listas, mapas) - Ni siquiera estoy usando variables locales, porque toda la información requerida para resolver el problema está presente como parámetros del método.
En el código de su pregunta, se supone que la variable v
hace lo que hace el parámetro acc
en mi respuesta, a saber: modificar un valor acumulado cada vez que se invoca la recursión. Al final, solo necesita devolver el valor acumulado de la función auxiliar (que no debe tener un tipo de devolución void
) y así obtendrá el valor en foo()
.
Entonces, ¿una variable estática es la única manera cuando se usa la recursión? – user1220022
@ user1220022 absolutamente no, el uso de atributos para almacenar el estado durante una recursividad es (en general) innecesario. Eche un vistazo a mi respuesta, utilizo solo parámetros para hacer un seguimiento del estado y no se usan variables –