Torres de hanoi
-
Upload
martin-saavedra -
Category
Documents
-
view
271 -
download
1
Transcript of Torres de hanoi
Torres de Hanoi
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.
-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.
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.
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)
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,
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;
}
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
EJEMPLO: Con 5 discos harán falta 25-1=31 movimientos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Total: 31 movimientos