Torre de hanoi

732 views

Published on

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
732
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Torre de hanoi

  1. 1. REPÚBLICA BOLIVARIANA DE VENEZUELA INSTITUTO UNIVERSITARIO POLITÉCNICO “SANTIAGO MARIÑO” EXTENSIÓN MATURÍNTORRE DE HANOI Trabajo de Programación No Numérica II Autor(es): Felizola Vicenzo Asesor(a): Ing. María Aguilera Maturín, Junio de 2012
  2. 2. La Torre de Hanoi, también conocido como el brahmanismo o el rompecabezas de latorre de fin del mundo, fue inventado y vendido como un juguete, en 1883, por elmatemático francés Édouard Lucas.Según él, el juego que fue muy popular en China y Japón llegó de Vietnam. Elmatemá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, cuyafunción era la de mejorar la disciplina mental de los jóvenes monjes. Según laleyenda, 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.
  3. 3. En una de estas barras, el dios Brahma en el momento de la creación del mundo, puso64 discos de oro puro, por lo que el más grande es difícil de mantener en la placa debronce y el otro se redujo al llegar a la cima.El premio fue entregado a los monjes para mover la torre formada por discos deuna barra a otra, utilizando el tercero como asistente con las restricciones de moverun disco a la vez y nunca colocar un disco más grande sobre uno de menor tamaño
  4. 4. 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 losiguiente: 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 estabancolocados en la varilla A. Para el traslado de discos podemos utilizar la varilla C, pero sedebe cumplir siempre la condición de que sólo se puede mover un disco cada vez y queen ningún caso y en ningún paso se podrá colocar un disco mayor sobre otro de menorradio que él.
  5. 5. El problema de las Torres de Hanoi es un problema utilizado frecuentemente comoejemplo 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 crecientede 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 estapermitido poner un disco más grande sobre otro más pequeño. La tarea consiste enmover 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 pantallatodos 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 solodisco 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 acualquier otra ¿qué se debe hacer?Luego de hacer esta pregunta es fácil llegar a la conclusión de que primero hay quemover los primeros n − 1 discos a la torre B, luego el disco n a la torre C, yposteriormente mover los n − 1 discos de la torre B a la torre C.
  6. 6. Se puede estar seguro que lo anterior funciona ya que los primeros n − 1 discos de latorre siempre serán mas pequeños que el disco n, por lo cual se podrían colocarlibremente 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 otratorre.• 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, perosi están presentes ambos.El siguiente código muestra una implementación del algoritmo anterior, y utiliza comopará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);
  7. 7. (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 unmovimiento.Por lo tanto se obtiene la siguiente función recursiva: H(1) = 1 H(n) = H(n − 1) * 2 + 1
  8. 8. Ahora se pueden hacer unas cuantas observaciones para simplificar aún más estafunción recursiva:H (1) = 1 = 1H (2) = 2 + 1 = 3H (3) = 4 + 2 + 1 = 7H (4) = 8 + 4 + 2 + 1 = 15H (5) = 16 + 8 + 4 + 2 + 1 = 31H (6) = 32 + 16 + 8 + 4 + 2 + 1 = 63Por 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 +... + 20Solució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) unavez 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
  9. 9. Ahora se pueden hacer unas cuantas observaciones para simplificar aún más estafunción recursiva:H (1) = 1 = 1H (2) = 2 + 1 = 3H (3) = 4 + 2 + 1 = 7H (4) = 8 + 4 + 2 + 1 = 15H (5) = 16 + 8 + 4 + 2 + 1 = 31H (6) = 32 + 16 + 8 + 4 + 2 + 1 = 63Por 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 +... + 20Entonces para cualquier número n la proposición se debe de cumplir. H(n) = 2n - 1De nuevo por inducción H (0) = 20 − 1Y se puede suponer que para alguna n, H(n) = 2n − 1 (2n − 1)(n) + 1 = 2n+1 − 2 + 1 = 2n+1 − 1Por lo tanto, se concluye que la respuesta de este problema es sin lugar a dudas 2n − 1

×