El documento describe el problema clásico de las Torres de Hanoi, que involucra mover discos de diferentes tamaños entre tres postes siguiendo tres reglas. Explica las versiones recursiva e iterativa del algoritmo para resolver el problema, notando que la iterativa es más rápida pero ambas requieren 2^n-1 movimientos para n discos.
Juego lógico matemático, que consiste en la apilación de 2, 3, 4, 5, o más discos en una de las tres estacas que se ubican de manera vertical sobre un tablero.
Juego lógico matemático, que consiste en la apilación de 2, 3, 4, 5, o más discos en una de las tres estacas que se ubican de manera vertical sobre un tablero.
2. LAS TORRES DE HANOI
El clásico problema de las torres de Hanoi
fue dado a conocer en 1883 por el
matemático francés Eduard Lucas.
3. -Consiste en tres columnas verticales y un número
indeterminado de discos, que determinarán la
complejidad de la solución, al ser mayor la
cantidad de estos.
-No hay dos discos iguales, ya que son de tamaños
ascendentes ubicados de mayor a menor en la
primera columna
-No se puede colocar ningún disco de mayor
tamaño sobre un disco menor a él en ningún
momento.
-El fin del juego consiste en traspasar todos los
discos desde la primera columna hacia la tercera
ubicándolos de mayor a menor ascendentemente,
de igual forma que estaban ubicados al comienzo
del juego.
4. Las torres de Hanoi tienen 3 reglas principales:
1. Sólo se puede mover un disco a la vez.
2. Un disco de mayor tamaño no puede posarse sobre uno más pequeño que él mismo.
3.Sólo puedes desplazar el disco que se encuentre en la parte superior de cada columna.
Eficacia: Posee una eficacia alta, ya que cumple con el ordenamiento o traspaso de la columna
origen a la destino, en un juego perfecto, que tiene fin.
Rendimiento: Bueno, ya que el código del algoritmo, no utiliza mucha memoria, puesto que los
paso con los que funcionan son obligatorios.
Utilidad: Juego intelectual o de rompecabezas, que es usado además como un juego que ayude
al desarrollo de la inteligencia en niños (Educacional).
Complejidad: (Recursivo).
Al ser jugado realmente su complejidad varia en un número indeterminado de discos, que
determinarán la complejidad de la solución, al ser mayor la cantidad de estos.
La complejidad del codigo es mas elevada , ya que para que quede correctamente se necesitan
una serie de funciones que se llamen a si mismas para que el programa entregue el resultado
correcto.
Comprueba que para mover n discos son necesarios
2n-1 movimientos.
5. Algoritmo Recursivo.
Hanoi (dim 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)
6. Iterativa
Otra manera de resolver el problema, sin utilizar la recursividad, se basa en el hecho de
que para obtener la solución más corta, es necesario mover el disco más pequeño en
todos los pasos impares, mientras que en los pasos pares sólo existe un movimiento
posible que no lo incluye. El problema se reduce a decidir en cada paso impar a cuál de
las dos pilas posibles se desplazará el disco pequeño:
El algoritmo en cuestión depende del número de discos del problema.
Si inicialmente se tiene un número impar de discos, el primer movimiento debe ser
colocar el disco más pequeño en la pila destino, y en cada paso impar se le mueve a la
siguiente pila a su izquierda (o a la pila destino, si está en la pila origen).
La secuencia será DESTINO, AUXILIAR, ORIGEN, DESTINO, AUXILIAR, ORIGEN,
etc.
Si se tiene inicialmente un número par de discos, el primer movimiento debe ser colocar
el disco más pequeño en la pila auxiliar, y en cada paso impar se le mueve a la siguiente
pila a su derecha (o a la pila origen, si está en la pila destino).
La secuencia será AUXILIAR, DESTINO, ORIGEN, AUXILIAR, DESTINO, ORIGEN,
7. Algoritmo Iterativo
public Hanoi(int numdiscos)
{
this.numdiscos= numdiscos;
agujas= new int[3][numdiscos];
cimaAguja= new int[3];
nummovimientos= 0;
for (int nivel= 0; nivel < numdiscos; nivel++)
{
int disco= numdiscos - nivel;
agujas[ORIGEN][nivel]= disco;
agujas[TRABAJO][nivel]= 0;
agujas[DESTINO][nivel]= 0;
}
cimaAguja[ORIGEN]= numdiscos - 1;
cimaAguja[TRABAJO]= -1;
cimaAguja[DESTINO]= -1;
}
8. Código Recursivo Código Iterativo
-(2^n)-1
-Es mas lento
-El mas pequeño solo busca el
lugar donde pueda ubicarse
-Se mueve a la posición
habilitada
-(2^n)-1
-Es mas Rápido
-Es necesario mover el disco
más pequeño en todos los
pasos impares
-Cuando es par, se mueve a la
derecha y cuando es impar se
mueve a la izquierda