You are on page 1of 2

Las Torres de Hanoi - Recursivo

El algoritmo recursivo sería: Hanoi (N , columna A, columna B , columna C) N, origen, destino , auxiliar Si N == 1 Imprimir : Pasar disco de A a B else Hanoi(N-1 , A , C, B) Imprimir : Pasar disco de A a B Hanoi(N-1 , C , B , A) Veamos paso a paso como procede el algoritmo en el caso de tres discos: Hanoi(3,1,2,3) Hanoi(1,1,2,3) --> Cambia de 1 a 2 Hanoi(2,1,3,2) --> Cambia de 1 a 3 --> Cambia de 1 a 3 Hanoi(1,2,3,1) --> Cambia de 2 a 3 Cambia de 1 a 2 --> Cambia de 1 a 2 ---> Cambia de 1 a 2 Hanoi(1,3,1,2) --> Cambia de 3 a 1 Hanoi(2,3,2,1) --> Cambia de 3 a 2 --> Cambia de 3 a 2 Hanoi(1,1,2,3) --> Cambia de 1 a 2 ====================#include <iostream> using namespace std; /* funcion hanoi: n = numero de discos, in = inicio, aux = medio, dest = final */ int hanoi(int n, char in, char aux, char dest) { /* si no hay discos retorna 0*/ if (n == 0) return 0; else { // se mueven n - 1 discos desde origen a auxiliar (medio) // se considera a aux como destino hanoi(n - 1, in, dest, aux); // imprime movimiento cout << "Mover disco " << n << " desde " << in << " a " << dest << endl; // se mueven n - 1 discos desde auxiliar a destino // se considera a aux como inicio hanoi(n - 1, aux, in, dest); } } int main() { /* I = inicio, A = auxiliar (medio), D = destino */ hanoi(6, 'I', 'A', 'D'); cin.get(); return 0; } /* Esta implementación calcula los movimientos para 6 discos. Puedes cambiar el número de discos en el llamado a la función hanoi(). */

FORMA RECURSIVA

hanoi ( N, origen, destino, auxiliar ) { si N mayor a 0 entonces hanoi(N - 1, origen, auxiliar, destino) pasar disco N de origen a destino hanoi(N - 1, auxiliar, destino, origen) fin-si }

'I'. B .2.3. origen) fin-si } .3) Hanoi(1.3) --> Cambia de 1 a 2 Hanoi(2. origen.Recursivo El algoritmo recursivo sería: Hanoi (N . B) Imprimir : Pasar disco de A a B Hanoi(N-1 . A) Veamos paso a paso como procede el algoritmo en el caso de tres discos: Hanoi(3.3) --> Cambia de 1 a 2 ====================#include <iostream> using namespace std. dest = final */ int hanoi(int n.3.1.1. char dest) { /* si no hay discos retorna 0*/ if (n == 0) return 0.3.2. aux. /* funcion hanoi: n = numero de discos. // se mueven n . else { // se mueven n .1 discos desde auxiliar a destino // se considera a aux como inicio hanoi(n . destino. char in.2. D = destino */ hanoi(6. origen.1. destino) pasar disco N de origen a destino hanoi(N . 'A'. auxiliar. Puedes cambiar el número de discos en el llamado a la función hanoi(). char aux.get(). columna B . } } int main() { /* I = inicio.1 discos desde origen a auxiliar (medio) // se considera a aux como destino hanoi(n .2) --> Cambia de 1 a 3 --> Cambia de 1 a 3 Hanoi(1. destino. C . A = auxiliar (medio).1. C. dest). destino . in = inicio. in. aux). auxiliar ) { si N mayor a 0 entonces hanoi(N . dest.Las Torres de Hanoi .1) --> Cambia de 3 a 2 --> Cambia de 3 a 2 Hanoi(1.1.1.3. return 0. // imprime movimiento cout << "Mover disco " << n << " desde " << in << " a " << dest << endl.2) --> Cambia de 3 a 1 Hanoi(2. A . auxiliar. } /* Esta implementación calcula los movimientos para 6 discos. columna C) N.1) --> Cambia de 2 a 3 Cambia de 1 a 2 --> Cambia de 1 a 2 ---> Cambia de 1 a 2 Hanoi(1.1.1. */ FORMA RECURSIVA hanoi ( N.2.1.2. aux = medio. 'D'). in. auxiliar Si N == 1 Imprimir : Pasar disco de A a B else Hanoi(N-1 . columna A. origen. cin.