es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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í.

Tags:  , ,

Answer

  1. Avatar for 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 de a llegue a cero.

    Inicialmente, c se establece en cero y se llama a la función add con el argumento “6”. Cuando se llama a la función add con un argumento de 6, entra en un bucle que cuenta desde 6 hasta 1, incrementando c cada vez.

    Cuando a llega a cero, se ejecuta la declaración if, y se devuelve el valor de c 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 cuando a es igual a cero.

    Una vez que se completan las llamadas recursivas, se devuelve el valor final de c a main, que es igual al número total de veces que se llamó a la función add (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 si a no es igual a cero. Esto asegurará que el mensaje “Hello” se imprima solo una vez por cada valor distinto de cero de a.

    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;
    }


    Esto producirá la salida esperada:

    HelloHelloHelloHelloHelloHelloFinal 6
    “`

Comments are closed.