Rastreando llamadas recursivas.
Estoy aprendiendo el concepto de recursión y, para practicar mis conocimientos, escribí el siguiente programa.
“`C++
#include <bits stdc++.h="">
using namespace std;
int c = 0;
int add(int a) {
if (a == 0) {
return c;
}
c = c + 1;
add(a – 1);
cout << "Hola";
}
int main() {
int x = add(6);
cout << "Final " << x;
}
<pre><code><br />Este produce la siguiente salida, que no es la que esperaba:
</code></pre>
HolaHolaHolaHolaHolaHolaFinal 5134464
“`
¿Por qué el programa no se está terminando cuando la condición a==0
se cumple y retorna el resultado final a la función principal?
En lugar de eso, está imprimiendo “Hola” 6 veces, pero la declaración de salida está después de la llamada recursiva.
¿Por qué el código después de la llamada recursiva todavía se ejecuta múltiples veces?
Yo esperaba que nunca fuera ejecutado.
Sigo intentando entender cómo funciona la recursión, así que me gustaría saber qué está sucediendo exactamente aquí.
davy.ai
Explicación del código
La recursión es una técnica en la que una función se llama a sí misma para resolver subproblemas más pequeños de un problema más grande. En este programa, la función
add
utiliza la recursión para contar el número de veces que la función ha sido llamada (excluyendo la llamada inicial) hasta que el valor dea
llegue a cero.Inicialmente,
c
se establece en cero y se llama a la funciónadd
con el argumento “6”. Cuando se llama a la funciónadd
con un argumento de 6, entra en un bucle que cuenta desde 6 hasta 1, incrementandoc
cada vez.Cuando
a
llega a cero, se ejecuta la declaraciónif
, y se devuelve el valor dec
a la función llamante (main
). En este punto, la llamada a la función debería haber terminado, pero el programa no se termina.Esto se debe a que, después de la llamada recursiva, hay una instrucción
cout
que imprime “Hello” en la consola. Esta instrucción se ejecuta cada vez que se llama a la función, incluyendo cuandoa
es igual a cero.Una vez que se completan las llamadas recursivas, se devuelve el valor final de
c
amain
, que es igual al número total de veces que se llamó a la funciónadd
(excluyendo la llamada inicial).Solución
Para solucionar el problema, la declaración
cout
debe moverse antes de la llamada recursiva, de modo que se ejecute solo sia
no es igual a cero. Esto asegurará que el mensaje “Hello” se imprima solo una vez por cada valor distinto de cero dea
.Además, se debe agregar la declaración de retorno a la llamada recursiva:
“`C++
#include
using namespace std;
int c = 0;
int add(int a) {
if (a == 0) {
return c;
}
cout << “Hello”;
c = c + 1;
return add(a – 1);
}
int main() {
int x = add(6);
cout << “Final ” << x;
}
HelloHelloHelloHelloHelloHelloFinal 6
“`