Algoritmo de la Torre de Hanoi: Python, C++ Code

โšก Resumen inteligente

El algoritmo de la Torre de Hanoi es un rompecabezas recursivo clรกsico que consiste en mover una pila de discos entre tres clavijas sin colocar nunca un disco mรกs grande encima de uno mรกs pequeรฑo, lo que ilustra claramente la estrategia de divide y vencerรกs.

  • ๐Ÿ—ผ Configuraciรณn del rompecabezas: Tres clavijas y n discos apilados en orden decreciente de tamaรฑo en la clavija de origen, esperando a ser movidos a la clavija de destino a travรฉs de una clavija auxiliar.
  • ๐Ÿ“œ Reglas: Solo se mueve un disco a la vez, solo puede moverse el disco superior de cada clavija, y un disco mรกs grande no puede apoyarse sobre uno mรกs pequeรฑo.
  • ๐Ÿ” Idea recursiva: Mueva n-1 discos a la clavija auxiliar, mueva el disco mรกs grande a la clavija de destino y luego mueva los n-1 discos de la clavija auxiliar a la de destino.
  • ๐Ÿ‡ง๐Ÿ‡ท Complejidad del tiempo: Resolver n discos requiere 2^n โ€“ 1 movimientos, lo que da una complejidad temporal exponencial O(2^n) que crece muy rรกpidamente a medida que n aumenta.
  • ๐Ÿง  Complejidad espacial: La pila de recursiรณn contiene hasta n marcos a la vez, por lo que la complejidad espacial de la soluciรณn recursiva es O(n).
  • ๐Ÿ› ๏ธ Aplicaciones: Enseรฑanza de la recursiรณn, esquemas de rotaciรณn de respaldo, movimiento de datos basado en pilas, secuenciaciรณn robรณtica y comprensiรณn del diseรฑo de algoritmos de divide y vencerรกs.

Algoritmo de la Torre de Hanoi

ยฟQuรฉ es la Torre de Hanoi?

La Torre de Hanoi es un rompecabezas matemรกtico que consta de tres varillas y una pila de discos de tamaรฑo decreciente colocados uno encima del otro. Tambiรฉn se la conoce como la Torre de Brahma o la Torre de Lucas, ya que el matemรกtico francรฉs ร‰douard Lucas la introdujo en 1883. El rompecabezas se basa en leyendas sobre discos de oro que se movรญan entre tres varillas.

Este rompecabezas tiene tres varillas y un nรบmero variable de discos apilados. Las varillas estรกn dispuestas en forma de torres cรญclicas, de modo que los discos mรกs grandes se apilan en la parte inferior y los mรกs pequeรฑos en la parte superior.

Inicialmente, se nos proporcionan tres clavijas o varillas. En una de ellas (la clavija A en el ejemplo) estรกn apilados todos los discos. El objetivo es mover toda la pila de una varilla (A) a otra (C) siguiendo unas reglas especรญficas.

Aquรญ estรก la configuraciรณn inicial del rompecabezas:

Problema de la Torre de Hanoi

Problema de la Torre de Hanoi

Y este es el objetivo final:

Torre de Hanoi

Reglas de la Torre de Hanoi

Estas son las reglas esenciales para la Torre de Hanoi:

  • En la fase inicial del rompecabezas, todos los discos estรกn apilados sobre la varilla uno.
  • En la fase final, todos los discos de la varilla uno se apilan sobre la varilla dos o la varilla tres.
  • En un momento dado, solo un disco puede moverse de una varilla a otra.
  • Solo se puede mover el disco superior de la varilla.
  • No se puede colocar un disco encima de otro mรกs pequeรฑo.

La leyenda original trataba sobre mover 64 discos. Los sacerdotes podรญan mover un disco a la vez segรบn las reglas. Segรบn la leyenda, existรญa una profecรญa que decรญa que el mundo se acabarรญa si lograban completar la hazaรฑa. En la secciรณn de complejidad temporal, demostraremos que una configuraciรณn de la Torre de Hanoi con n discos requiere 2^n โ€“ 1 movimientos.

Asรญ pues, si los sacerdotes necesitaban 1 segundo para mover un disco, el tiempo total para resolver el rompecabezas serรญa de 2^64 โ€“ 1 segundos, o aproximadamente 584,942,417,356 aรฑos, 26 dรญas, 7 horas y 15 segundos.

Algoritmo para la Torre de Hanoi

La forma mรกs comรบn de resolver la Torre de Hanoi es mediante un algoritmo recursivo. Primero, elegimos dos varillas como origen y destino; la varilla sobrante actรบa como auxiliar o ayudante.

Estos son los pasos para resolver el rompecabezas de la Torre de Hanoi:

  • Mueva los n-1 discos superiores desde la clavija de origen a la clavija auxiliar.
  • Mueva el enรฉsimo disco desde la clavija de origen a la clavija de destino.
  • Mueva los n-1 discos restantes desde la clavija auxiliar a la clavija de destino.

Nota: Si disponemos de un solo disco, podemos moverlo directamente desde el origen hasta el destino.

Cรณmo resolver el rompecabezas de la Torre de Hanoi

Ilustremos el algoritmo para tres discos. Consideremos la clavija A como origen, la clavija B como auxiliar y la clavija C como destino.

Paso 1) Inicialmente, todos los discos estรกn apilados en la clavija A.

Resuelve el rompecabezas de la Torre de Hanoi

En esta etapa: Origen = Clavija A, Destino = Clavija C, Ayudante = Clavija B.

Ahora, necesitamos mover los n-1 discos superiores desde la fuente al asistente.

Nota: Aunque solo podemos mover un disco a la vez, este paso reduce nuestro problema de 3 discos a un problema de 2 discos, que se resuelve mediante una llamada recursiva.

Paso 2) Al realizar una llamada recursiva desde la clavija A con la clavija B como destino, utilizamos la clavija C como auxiliar.

Observe que volvemos a la primera etapa del mismo problema de la Torre de Hanoi, pero ahora con dos discos. Movemos n-1 (es decir, un) disco desde la fuente hasta el ayudante, que mueve el disco mรกs pequeรฑo de la clavija A a la clavija C.

Resuelve el rompecabezas de la Torre de Hanoi

En esta etapa: Origen = clavija A, Destino = clavija B, Ayudante = clavija C.

Paso 3) Segรบn el algoritmo, el enรฉsimo (segundo) disco se transfiere ahora al destino, la clavija B.

Resuelve el rompecabezas de la Torre de Hanoi

En esta etapa: Origen = clavija A, Destino = clavija B, Ayudante = clavija C.

Paso 4) Ahora, movemos el disco n-1 (disco uno) desde la clavija auxiliar C hasta la clavija de destino B, siguiendo la tercera etapa del algoritmo.

Resuelve el rompecabezas de la Torre de Hanoi

En esta etapa: Origen = clavija A, Destino = clavija B, Ayudante = clavija C.

Paso 5) Tras completar la llamada recursiva, volvemos a la configuraciรณn anterior de la primera etapa del algoritmo.

Paso 6) En la segunda etapa, movemos el disco 3 desde la clavija de origen A hasta la clavija de destino C.

En esta etapa: Origen = clavija A, Destino = clavija C, Ayudante = clavija B.

Paso 7) La siguiente tarea consiste en trasladar los discos restantes desde el soporte (clavija B) hasta el destino (clavija C). En esta ocasiรณn, utilizaremos la fuente original (clavija A) como soporte.

Resuelve el rompecabezas de la Torre de Hanoi

Paso 8) Dado que no podemos mover dos discos a la vez, hacemos una llamada recursiva para el disco 1. Segรบn nuestro algoritmo, el destino en este paso es la clavija A.

Resuelve el rompecabezas de la Torre de Hanoi

En esta etapa: Origen = clavija B, Destino = clavija A, Ayudante = clavija C.

Paso 9) Nuestra llamada recursiva ha finalizado. Ahora movemos el disco 2 desde su origen hasta su destino.

Resuelve el rompecabezas de la Torre de Hanoi

En esta etapa: Origen = clavija B, Destino = clavija C, Ayudante = clavija A.

Paso 10) Finalizamos moviendo el disco restante n-1 (disco 1) del dispositivo auxiliar al dispositivo de destino.

Resuelve el rompecabezas de la Torre de Hanoi

En esta etapa: Origen = clavija A, Destino = clavija C, Ayudante = clavija B.

Apodo Code para la Torre de Hanoi

START
Procedure Tower_Of_Hanoi(disk, source, dest, helper)
    IF disk == 1 THEN
        move disk from source to dest
    ELSE
        Tower_Of_Hanoi(disk - 1, source, helper, dest)
        move disk from source to dest
        Tower_Of_Hanoi(disk - 1, helper, dest, source)
    END IF
END Procedure

cรณdigo de programa en C++

#include <bits/stdc++.h>
using namespace std;
void tower_of_hanoi(int num, string source, string dest, string helper) {
    if (num == 1) {
        cout << " Move disk 1 from tower " << source << " to tower " << dest << endl;
        return;
    }
    tower_of_hanoi(num - 1, source, helper, dest);
    cout << " Move disk " << num << " from tower " << source << " to tower " << dest << endl;
    tower_of_hanoi(num - 1, helper, dest, source);
}
int main() {
    int num;
    cin >> num;
    printf("The sequence of moves :\n");
    tower_of_hanoi(num, "I", "III", "II");
    return 0;
}

Salida:

3
The sequence of moves :
Move disk 1 from tower I to tower III
Move disk 2 from tower I to tower II
Move disk 1 from tower III to tower II
Move disk 3 from tower I to tower III
Move disk 1 from tower II to tower I
Move disk 2 from tower II to tower III
Move disk 1 from tower I to tower III

cรณdigo de programa en Python

def tower_of_hanoi(n, source, destination, helper):
    if n == 1:
        print("Move disk 1 from peg", source, "to peg", destination)
        return
    tower_of_hanoi(n - 1, source, helper, destination)
    print("Move disk", n, "from peg", source, "to peg", destination)
    tower_of_hanoi(n - 1, helper, destination, source)
# n = number of disks
n = 3
tower_of_hanoi(n, 'A', 'B', 'C')

Salida:

Move disk 1 from peg A to peg B
Move disk 2 from peg A to peg C
Move disk 1 from peg B to peg C
Move disk 3 from peg A to peg B
Move disk 1 from peg C to peg A
Move disk 2 from peg C to peg B
Move disk 1 from peg A to peg B

Complejidad de la Torre de Hanoi

Aquรญ se muestra la complejidad temporal y espacial de la Torre de Hanoi:

1) Complejidad temporal:

Volviendo al algoritmo, hacemos una llamada recursiva para (n-1) discos dos veces por llamada. Cada (n-1) recursiรณn se divide en ((n-1)-1) recursiones, y asรญ sucesivamente, hasta que llegamos al caso base de un solo disco.

Para tres discos:

  • El disco 3 llama dos veces a la funciรณn recursiva del disco 2.
  • El disco 2 llama dos veces a la funciรณn recursiva del disco 1.
  • El disco 1 se mueve en tiempo constante, lo que da tiempo para resolver el problema de los tres discos.

Expresado como una recurrencia:

= 2 ร— (Tiempo para resolver para dos discos) + tiempo constante para mover el disco 3

= 2 ร— (2 ร— tiempo para resolver un disco + tiempo constante para mover el disco 2) + tiempo constante para mover el disco 3

= (2 ร— 2) ร— tiempo constante para mover el disco 1 + 2 ร— tiempo constante para mover el disco 2 + tiempo constante para mover el disco 3

Para n discos, esto se convierte en:

2n-1 ร— tiempo constante para mover el disco 1 + 2n-2 ร— tiempo constante para mover el disco 2 + โ€ฆ.

Esta progresiรณn geomรฉtrica suma O(2n โ€“ 1), que se simplifica a O (2n), una complejidad temporal exponencial.

2) Complejidad espacial:

La complejidad espacial de la Torre de Hanoi es O(n). La recursiรณn utiliza la pila de llamadas, cuya profundidad mรกxima es igual a n, el nรบmero de discos. Por eso, la complejidad espacial es O(n).

Preguntas Frecuentes

El algoritmo de la Torre de Hanoi es un procedimiento recursivo que mueve n discos desde una clavija de origen a una clavija de destino utilizando una clavija auxiliar, sin colocar nunca un disco mรกs grande encima de uno mรกs pequeรฑo.

El nรบmero mรญnimo de movimientos para n discos es 2^n โ€“ 1. Tres discos necesitan 7 movimientos, cuatro discos necesitan 15 y diez discos necesitan 1,023 movimientos.

La complejidad temporal es O(2^n) porque cada disco adicional duplica el trabajo. La recurrencia T(n) = 2T(n-1) + 1 se resuelve como 2^n โ€“ 1, que es exponencial.

La complejidad espacial es O(n) porque la pila de llamadas recursivas almacena un marco por cada disco que se procesa. La profundidad mรกxima de recursiรณn alcanza n, por lo que la memoria auxiliar necesaria es lineal con respecto al nรบmero de discos.

Sรญ. Una soluciรณn iterativa utiliza un bucle con un patrรณn fijo: en los movimientos impares, intercambia cรญclicamente el disco mรกs pequeรฑo entre las clavijas, y en los movimientos pares, realiza el รบnico movimiento vรกlido que no sea el mรกs pequeรฑo.

El algoritmo enseรฑa recursiรณn, modela esquemas de rotaciรณn de respaldo para el almacenamiento, guรญa la secuenciaciรณn de brazos robรณticos y aparece en pruebas de neuropsicologรญa que miden la capacidad de planificaciรณn.

Los agentes de aprendizaje por refuerzo resuelven el problema de la Torre de Hanoi tratando cada configuraciรณn de disco como un estado y cada movimiento como una acciรณn. Es un referente comรบn para la planificaciรณn y el aprendizaje de polรญticas jerรกrquicas.

Sรญ. GitHub Copilot, ChatGPT y Gemini generar soluciones recursivas de la Torre de Hanoi en Python, C++, y JavaLos desarrolladores aรบn deben verificar los casos base y el orden de los argumentos.

Resumir este post con: