Problema de recursividad de la Torre de Hanoi

# incluir ltfstream gt

# incluir ltiostream gt

Usar el espacio de nombres estándar

de stream fout(" out . txt ");

void Move(int n, char x, char y)

{

fout lt lt "barra" < ltn lt lt "número de" < ltx lt lt "mover a"

}

void Hannoi(int n, char a, char b, char c)

{

Si (n== 1 )

Mover(1, a, c);

Otros

{

Hannoy (n-1, a , c, b);

Mover(n, a, c);

Hannoy (n-1, b, a, c); >

}

int main()

{

fout lt lt "La siguiente es la solución para la Torre de Siete Pisos en Hanoi:"

Hannoi(7, 'a', 'b', 'c'); // Llamar

fout close()

cout lt. "¡Salida completada!" lt ltendl

Devuelve 0;

La Torre de Hanoi se implementa mediante un método recursivo.

Quizás no comprendas completamente la recursividad. De todos modos, recuerda que los procedimientos siempre se realizan paso a paso en orden. Si se llama a una función, establezca un punto de interrupción en el lugar donde se llama, ejecute la función y luego regrese al punto de interrupción después de la ejecución. ¡Nunca cambies!

Secuencia de ejecución del programa

Hannoi(7, 'a', 'b', 'c' aquí se llama a la función, se ejecuta la función y el parámetro n=); Se pasa 7.

El primer paso es ejecutar la declaración de juicio e ingresar la ejecución else en función del valor de n.

El segundo paso es ejecutar Hannoi(n-1, a, c, b); en este momento, la función en sí se llama recursividad; Puede ver que el valor entrante de n-1 es equivalente al valor entrante de n = 6 y los valores de a, c y b. Preste atención al orden. Cuando se llama, los valores de a, c y b son los primeros valores pasados.

El tercer paso es ejecutar la función Hannoi (int n, char a, char b, char c), lo cual es comprensible. El valor n pasado en este momento es 6, pero los valores de a, b y c han cambiado en comparación con el primer valor. Puede entenderse como a (2) = a (1), b (. Aquí los corchetes representan funciones El número de llamadas Lo más confuso aquí son en realidad los valores de A, B y C. Será más fácil de entender si usa su propio cuaderno para enumerar los valores. ​​de A, B y C en el orden de entrega

Del mismo modo, ejecute el juicio, ingrese n gt1 else, ejecute en orden, primero ejecute Hannoi (n-1, a, c, b). ); luego se llama a sí mismo, presta atención a los valores entrantes, que son A (2), C (2), B (2), y luego ejecuta la función Hannoi (int n, char a, char b, char c). El valor recibido en este momento es A (3) = A (2), B (3) = C (. 2), C. Haz una tabla para ti y ordénala más tarde.

Repite esto. hasta que n = 1 mire Hannoi (n-1, a, c, b) cada vez que N disminuye en 1. Entonces, cuando se recurre a n-1, si (n == 1) se ejecuta directamente, ¿se ha modificado? al final? Ejecuta Move(1, a, c); es decir, la función de salida ejecuta Move(int n, char x, char y ) y luego regresa al punto de interrupción de la llamada original.

Si no hay ninguna declaración, se devolverá la última función llamada. ¿Quién fue la última persona en llamar a Hannoi (int n, char a, char b, char c)? n-2 veces es Hannoi(n-1, a, c, b) en Hannoi(int n, char a, char b, char c llámalo, vuelve aquí y continúa satisfaciendo Move(n, a,); c); aquí no se necesita ninguna explicación. Después de generar, regrese y continúe ejecutando Hannoi (n-1, b, a, c) al revés. Comienza una nueva recursividad. Hagamos una nueva lista. Preste atención a los valores pasados ​​y su orden, y cuál es el valor de n en este momento.

En realidad, es posible que no entiendas claramente mi explicación. La clave es entender que la recursividad no es más que llamarse a uno mismo, y regresar después de la llamada es regresar al lugar donde se llamó por última vez, que es él mismo, pero los valores de la función utilizados dos veces son diferentes. Lo mejor es tomar notas y escribirlas varias veces para facilitar la comprensión y el análisis.

Este programa recursivo es muy clásico y vale la pena estudiarlo. ¡Descubrirás que es tan ingenioso y genial! Se recomienda no establecer n demasiado grande durante la prueba, de lo contrario se bloqueará fácilmente. ¡Es asombroso solo pensar en la cantidad de ciclos que hay dentro!