Torre de hanoi

9
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

Transcript of Torre de hanoi

Page 1: Torre de hanoi

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

Page 2: Torre de hanoi

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.

Page 3: Torre de hanoi

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

Page 4: Torre de hanoi

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.

Page 5: Torre de hanoi

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.

Page 6: Torre de hanoi

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);

Page 7: Torre de hanoi

(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

Page 8: Torre de hanoi

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

Page 9: Torre de hanoi

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