REPÚBLICA BOLIVARIANA DE VENEZUELA
INSTITUTO UNIVERSITARIO POLITÉCNICO
“SANTIAGO MARIÑO”
EXTENSIÓN MATURÍN
Maturín, Junio de 2012
TORRE DE HANOI
Trabajo de Programación No Numérica II
Autor(es): Felizola Vicenzo
Asesor(a): Ing. María Aguilera
La Torre de Hanoi, también conocido como el brahmanismo o el rompecabezas de la
torre de fin del mundo, fue inventado y vendido como un juguete, en 1883, por el
matemático francés Édouard Lucas.
Según él, el juego que fue muy popular en China y Japón llegó de Vietnam. El
matemático se inspiró en una leyenda hindú, que habla de un templo en Varanasi,
ciudad sagrada de la India, donde había una torre sagrada del brahmanismo, cuya
función era la de mejorar la disciplina mental de los jóvenes monjes. Según la
leyenda, el gran templo de Benarés, bajo la cúpula que marca el centro del mundo,
hay una placa de bronce en la que se fijan tres varillas de diamante.
En una de estas barras, el dios Brahma en el momento de la creación del mundo, puso
64 discos de oro puro, por lo que el más grande es difícil de mantener en la placa de
bronce y el otro se redujo al llegar a la cima.
El premio fue entregado a los monjes para mover la torre formada por discos de
una barra a otra, utilizando el tercero como asistente con las restricciones de mover
un disco a la vez y nunca colocar un disco más grande sobre uno de menor tamaño
El juego de las torres de Hanoi, o torres de diamante, es un juego oriental muy
antiguo que hoy se conoce en todo el mundo.
El juego matemático de las Torres de Hanoi consiste en un dispositivo que consta de
tres varillas verticales A, B y C y un número variable de discos. Los n discos son
todos de diferente tamaño y, en la posición de partida del juego, todos los discos están
colocados en la varilla A ordenados de mayor a menor tamaño, esto es, el mayor en el
lugar más bajo y el menor arriba.
Del número de discos depende la complejidad de la solución. El juego consiste en lo
siguiente: Comenzando en la posición de partida. Trasladar todos los discos a la varilla B,
pero colocados también de mayor a menor, en el mismo orden en el que estaban
colocados en la varilla A. Para el traslado de discos podemos utilizar la varilla C, pero se
debe cumplir siempre la condición de que sólo se puede mover un disco cada vez y que
en ningún caso y en ningún paso se podrá colocar un disco mayor sobre otro de menor
radio que él.
El problema de las Torres de Hanoi es un problema utilizado frecuentemente como
ejemplo de resolución de algoritmos.
Se puede imaginar que se tienen 3 postes llamados A, B y C.
En el poste A se tienen n discos de diferente diámetro, acomodados en orden creciente
de diámetro desde lo más alto hasta lo más bajo.
Solamente se puede mover un disco a la vez desde un poste hasta otro y no esta
permitido poner un disco más grande sobre otro más pequeño. La tarea consiste en
mover todos los discos desde el poste A hasta el poste C.
Ejemplo N 1:
Se debe Escribir una función que reciba como parámetro n y que imprima en pantalla
todos los pasos a seguir para mover los discos del poste A al poste C.
Solución Pensando primero en el caso mas pequeño y trivial si n = 1, se tendría un solo
disco y solo habría que moverlo de la torre A a la C.
Ahora, suponiendo que para algún n ya se sabe cómo mover n − 1 discos de una torre a
cualquier otra ¿qué se debe hacer?
Luego de hacer esta pregunta es fácil llegar a la conclusión de que primero hay que
mover los primeros n − 1 discos a la torre B, luego el disco n a la torre C, y
posteriormente mover los n − 1 discos de la torre B a la torre C.
Se puede estar seguro que lo anterior funciona ya que los primeros n − 1 discos de la
torre siempre serán mas pequeños que el disco n, por lo cual se podrían colocar
libremente sobre el disco n si así lo requirieren.
Por inducción entonces, el procedimiento anterior funciona.
Así que el algoritmo de Divide y Vencerás queda de la siguiente manera:
Sea X la torre original, Y la torre a la cual se quieren mover los discos, y Z la otra
torre.
• Para n > 1, hay que mover n − 1 discos de la torre x a la z, luego mover un disco de la
torre x a la Y y finalmente mover n − 1 discos de la torre Z a la Y.
• Para n = 1, hay que mover el disco de la torre X a la Y ignorando la torre Z.
Se puede notar que aquí los pasos de Divide y Vencerás se resumieron en uno sólo, pero
si están presentes ambos.
El siguiente código muestra una implementación del algoritmo anterior, y utiliza como
parámetros los nombres de las 3 torres, utilizando parámetros predeterminados como A,
B y C.
Código: Torres de Hanoi
(1) int hanoi(int n, char x='A', char y='C', char z='B'){
(2) if(n==1){
(3) printf("Mueve de %c a %c.\n", x, y);
(4) }else{
(5) hanoi(n-1, x, z, y);
(6) printf("Mueve de %c a %c.\n", x, y);
(7) hanoi(n-1, z, y, x);
(8) }
(9) }
Ejemplo N 2: ¿Cuántas líneas imprime Hanoi (n) (asumiendo que esta función está
implementada como se muestra en el código anterior)?
Solución Sea H(n) el número de líneas que imprime Hanoi (n).
Es obvio que H (1) = 1 puesto que Hanoi (1) solamente imprime una línea.
Se puede Notar que cada que se llama a Hanoi (n) se está llamando dos veces a Hanoi
(n−1) una vez en la línea 5 y otra en la línea 7. Además, en la línea 6 imprime un
movimiento.
Por lo tanto se obtiene la siguiente función recursiva:
H(1) = 1
H(n) = H(n − 1) * 2 + 1
Ahora se pueden hacer unas cuantas observaciones para simplificar aún más esta
función recursiva:
H (1) = 1 = 1
H (2) = 2 + 1 = 3
H (3) = 4 + 2 + 1 = 7
H (4) = 8 + 4 + 2 + 1 = 15
H (5) = 16 + 8 + 4 + 2 + 1 = 31
H (6) = 32 + 16 + 8 + 4 + 2 + 1 = 63
Por inducción se puede observar que como con H (1) si se cumple y
(2n-1 + 2n-2+ 2n-3 +... + 20) 2 + 1 = 2n + 2n-1 + 2n-2 +... + 20
Solución Sea H(n) el número de líneas que imprime Hanoi (n).
Es obvio que H (1) = 1 puesto que Hanoi (1) solamente imprime una línea.
Nótese que cada que se llama a Hanoi (n) se está llamando dos veces a Hanoi (n−1) una
vez en la línea 5 y otra en la línea 7. Además, en la línea 6 imprime un movimiento.
Por lo tanto obtenemos la siguiente función recursiva:
H(1) = 1
H(n) = H(n − 1) * 2 + 1
Ahora se pueden hacer unas cuantas observaciones para simplificar aún más esta
función recursiva:
H (1) = 1 = 1
H (2) = 2 + 1 = 3
H (3) = 4 + 2 + 1 = 7
H (4) = 8 + 4 + 2 + 1 = 15
H (5) = 16 + 8 + 4 + 2 + 1 = 31
H (6) = 32 + 16 + 8 + 4 + 2 + 1 = 63
Por inducción se puede observar que como con H (1) si se cumple y
(2n-1 + 2n-2+ 2n-3 +... + 20) 2 + 1 = 2n + 2n-1 + 2n-2 +... + 20
Entonces para cualquier número n la proposición se debe de cumplir.
H(n) = 2n - 1
De nuevo por inducción
H (0) = 20 − 1
Y se puede suponer que para alguna n, H(n) = 2n − 1
(2n − 1)(n) + 1 = 2n+1 − 2 + 1 = 2n+1 − 1
Por lo tanto, se concluye que la respuesta de este problema es sin lugar a dudas 2n − 1
Top Related