java - sumar - El método recursivo imprime 4 veces
recursividad en java ventajas y desventajas (4)
Así que estoy trabajando en aprender a utilizar la recursión a través de Java. He escrito un programa simple que agrega todos los números entre 1 y n y parece que es su trabajo. Donde me confundo es la declaración de impresión, se imprime 4 veces (para cada resultado de cada parte más pequeña de la solución) y no estoy seguro de cómo llega a la declaración de impresión si se llama nuevamente al método y las condiciones aún no se cumplen. Entiendo que esto se puede eludir creando una variable int en el método principal y que se le asigne la devolución.
public static void main(String[] args) {
int sum = recursiveCall(5);
}
public static int recursiveCall(int num) {
int sum = 0;
if(num == 1) {
sum = 1;
System.out.println(sum);
return sum;
}
else {
sum = recursiveCall(num - 1) + num;
}
// Notice it prints out all results of sum, not just the final value.
System.out.println(sum);
return sum;
}
Cuando la recursión es la pila está llena, comienza a vaciarse de la cola. Esta es la razón por la cual su declaración impresa debajo de las declaraciones if comienza a ejecutarse. Nota: El proceso de recursión devolverá su valor donde se invocó, por lo que si no se cumplen las condiciones, regresará a ese punto, pero el proceso de recursión continuará hasta que la pila se vacíe. Lo que sea que haya dicho es lo que se llama la Recursividad de la Cola.
Déjame explicar por qué sucede esto.
Su segunda declaración de impresión imprime todos los valores de suma excepto cuando n
= 1. Cuando n
= 1 la primera instrucción de impresión imprimirá el valor
Piénselo de esta manera: todas las llamadas al método no nulo volverán. Si no regresa, continuará ejecutándose hasta que se alcance una declaración de devolución.
Usted dice que la segunda declaración de impresión debe imprimir solo el último valor de suma. Pero verá, solo hay dos lugares que el método puede devolver: en la instrucción if (num == 1)
o al final del método. La ubicación anterior se alcanza solo una vez cuando n es 1, lo que significa que las otras cuatro veces el método regresará a través de la declaración de devolución al final. Para llegar a la declaración de devolución al final, debe ejecutarse la segunda impresión. Esto significa que la segunda declaración de impresión se debe ejecutar cuatro veces.
Use un depurador para recorrer el código paso a paso. Este es el más fácil de entender lo que realmente sucede.
Dibujé un diagrama de secuencia, espero que esto pueda explicar el procedimiento de recursión.
Hay un procedimiento retrospectivo para la recursión, el próximo comando se insertará en la pila de llamadas antes de que se llame al método de recursión. Así que podemos simplemente decir que System.out.println
se presionará para llamar a stack antes de recursiveCall
, y luego de que se devuelva la llamada recursiveCall
, el proceso principal continuará con el comando superior en la pila, que es System.out.println
.
Es debido a la segunda declaración de impresión debajo de la otra. En la ejecución, se llama a la función recursiva y no llega a la instrucción de impresión en la parte inferior. Pero después de n = 1, es decir, si se ejecuta la condición if, se vuelve a la función recursiva (2-1) y se baja a la suma regresiva (también la impresión) y se devuelve el valor de suma al lugar recursivo (3- 1) se llama y así sucesivamente ... Ahí es donde se imprime cada suma.
Un código que imprime solo la suma final se da a continuación. La impresión está incluida en el principal para imprimir la respuesta final solo. Espero que esto ayude.
public class add {
public static void main(String[] args) {
int sum = recursiveCall(5);
System.out.println(sum); // this will print 15
}
public static int recursiveCall(int num) {
int sum = 0;
if(num == 1) {
sum = 1;
//System.out.println(sum); this will print 1
return sum;
}
else {
sum = recursiveCall(num - 1) + num;
}
// System.out.println(sum); //this is the reason for each sum.
return sum;
}
}