torres de hanói
TRANSCRIPT
República Bolivariana de VenezuelaMin. de Poder Popular para la Educación UniversitariaInstituto universitario Politécnico Santiago MariñoEscuela de ingeniería de sistemasProgramación no numérica II
Las torres de Hanói
Por: David GuilarteCI: 22.653.158
Dividir y conquistarTan efectivo como el que seria su antónimo "En la unión está la fuerza"
es el proverbio "Divide y vencerás".
En esta ocasión nos referimos a la aplicación de dicho proverbio al modelado de algoritmos, más específicamente para el campo de la programación.
¿En qué consiste?El problema, grupo, ciclo o procedimiento general en cuestión se divide en sub-procesos y estos a su vez también se les trata de la misma manera hasta que cada uno llegue a una solución poco complicada, finalmente se suman los resultados para componer juntos el resultado final.
Pero ya que estamos tratando con algoritmos, mejor se ha de entender este modelo al que nos referimos con un ejemplo del mismo, con la estructura propia de un algoritmo como el que veremos a continuación
Dividir y conquistarFuncion divide_y_venceras(problema)
{ Si el problema es trivial entonces resolver el problema; Si no es trivial { descomponer el problema en n subproblemas más pequeños; para i=1 hasta n hacer divide_y_venceras(subproblema_k); combinar las soluciones; }}
Las torres de HanóiLas torres de Hanói, es un juego matemático o bien un rompecabezas que se juega en solitario, pertenece a la categoría de juegos de mesa.
Su resolución y sus reglas son bastante sencillas pero resulta un excelente ejemplo e introducción utilizado muy comúnmente en ciencias de la computación, en la programación, y en la teoría de algoritmosdebido a su fuerte indicio de funcionamiento procedural y también muy propicio para aplicar lo que se conoce en la programación y otros campos afines como 'Recursividad'
Su proceso de solución si bien puede ser bastante sencillo o de fácil entendimiento, dependiendo de ciertos parámetros puede llegar a ser muy extenso, haciendo más útil y conveniente la utilización de la programación y la recursividad para llevarlo a cabo de la manera más corta, precisa y automatizada.
Las torres de Hanói¿En qué consiste?Consiste en un tablero con tres varillas:• Una varilla de inicio• Una varilla destino• Una varilla auxiliar• Una cierta cantidad de discos de diferentes tamaños
Inicialmente, la primera varilla tendrá todos los discos ordenados de manera decreciente de abajo hacia arriba, es decir, el disco más grande en la base.
La idea es transportar los discos de la varilla inicio a la varilla destino en el mismo orden pero cumpliendo dos reglas sencillas:
• No se puede mover más de un disco a la vez• No se puede colocar un disco sobre otro de menor tamaño.
Un poco de historiaSe cuenta que en un antiguo templo de la India se encontraba una cúpula que señalaba el centro del mundo. Allí estaba una bandeja sobre la que existían tres agujas de diamante. En una mañana lluviosa, un rey mandó a poner 64 discos de oro ordenados por tamaño: el mayor, en la base de la bandeja, y el menor, arriba de todos los discos. Tras su colocación, los sacerdotes del templo intentaron mover los discos entre las agujas, según las leyes que se les habían entregado: «El sacerdote de turno no debe mover más de un disco a la vez, y no puede situar ningún disco encima de otro de menor diámetro».
Hoy no existe tal templo, no obstante, la falacia resultó ser tan efectista y tan bonita que junto al juego aún perdura en el tiempo.
Realmente el juego fue inventado por el matemático francés Edouard Lucasen el año 1883.
¿Como resolver la torre de Hanói?Para completar este juego seguiremos 3 pasos
recursivamente.
Usaremos una notación general:T(N, Ini, Aux, Fin)
T denota nuestra funciónN denota el número de discosIni es la varilla origenAux es la varilla auxiliarFin es la varilla destino
Pasos a seguir1. T(N-1, Ini, Fin, Aux)2. T(1, Ini, Aux, Fin)3. T(n-1, Aux, Ini, Fin)
Paso 1: Significa que se mueven los discos de encima (n-1) de la varilla Ini a la varilla Aux.
Paso 2: Mueve un disco de la varilla Ini a la varilla Fin.
Paso 3: Significa que se mueven los discos de encima (n-1) de la varilla Aux a la varilla Fin
Resolvamos un juego de Las Torres de Hanói
☺
Tenemos 3 discos, rojo, verde y azul todos colocados en la varilla A
Entonces, N = 3 (Número de discos)
Así que, empezaremos conT (3,A,B,C)
A B C
Seguiremos los 3 pasos recursivamente para hallar los
movimientos
T(3, A, B, C)
Aplicaremos los 3 pasos aquí
Paso 1: T(N-1, Ini, Fin, Aux) Paso 2: T(1, Ini, Aux, Fin) Paso 3: T(n-1, Aux, Ini, Fin)
Paso1: T(N-1, Ini, Fin, Aux)
T(3, A, B, C)
T(2, A, C, B )N = 3Ini= AAux = BFin = C
Sustituyendo valores tenemos T(2, A, C, B)
Paso2: T(1, Ini, Aux, Fin)
T(3, A, B, C)
T(2, A, C, B )N = 3Ini= AAux = BFin = C
Sustituyendo valores tenemos T(1, A, B, C )Esto significa: Mover A a C
T1, A, B, C) A a C
Paso3: T(N-1, Aux, Ini, Fin)
T(3, A, B, C)
T(2, A, C, B )N = 3Ini= AAux = BFin = C
Sustituyendo valores tenemos T(2, B, A, C )
T(1, A, B, C) A a C
T(2, B, A, C)
T(3, A, B, C)
T(2, A, C, B)N = 3Ini= AAux = BFin = C
T(1, A, B, C) A a C
T(2, B, A, C)
Ahora aplicaremos los 3 pasos aquí
T(3, A, B, C)
T(2, A, C, B )
T(1, A, B, C) A a C
T(2, B, A, C)
N = 2Ini = AAux = CFin = B
Paso1: T(N-1, Ini, Fin, Aux)Sustituyendo valores tenemos T(1, A, B, C )Esto significa: Mover A a C
T(1, A, B, C) A a C
T(3, A, B, C)
T(2, A, C, B )
T(1, A, B, C) A a C
T(2, B, A, C)
N = 2Ini = AAux = CFin = B
Sustituyendo valores tenemos T(1, A, C, B)Esto significa: Mover A a B
T(1, A, B, C) A a C
Paso2: T(1, Ini, Aux, Fin)
T(1, A, C, B) A a B
T(3, A, B, C)
T(2, A, C, B )
T(1, A, B, C) A a C
T(2, B, A, C)
N = 2Ini = AAux = CFin = B
Sustituyendo valores tenemos T(1, C, A, B)Esto significa: Mover C a B
T(1, A, B, C) A a C
Paso3: T(N-1, Aux, Ini, Fin)
T(1, A, C, B) A a B
T(1, C, A, B) C a B
T(3, A, B, C)
T(2, A, C, B )
T(1, A, B, C) A a C
T(2, B, A, C)
TT(1, A, B, C) A a C
T(1, A, C, B) A a B
T(1, C, A, B) C a B
Aplicaremos los 3 pasos aquí
T(3, A, B, C)
T(2, A, C, B )
T(1, A, B, C) A a C
T(2, B, A, C)
N = 2Ini = BAux = AFin = C
Sustituyendo valores tenemos T(1, B, C, A)
T(1, A, B, C) A a C
T(1, A, C, B) A a B
T(1, C, A, B) C a B
Paso1: T(N-1, Ini, Fin, Aux)
Esto significa: Mover B a A
T(1, B, C, A) B a A
T(3, A, B, C)
T(2, A, C, B )
T(1, A, B, C) A a C
T(2, B, A, C)
N = 2Ini = BAux = AFin = C
Sustituyendo valores tenemos T(1, B, A, C)
T(1, A, B, C) A a C
T(1, A, C, B) A a B
T(1, C, A, B) C a B
Paso2: T(1, Ini, Aux, Fin)Esto significa: Mover B a C
T(1, B, C, A) B a A
T(1, B, A, C) B a C
T(3, A, B, C)
T(2, A, C, B )
T(1, A, B, C) A a C
T(2, B, A, C)
N = 2Ini = BAux = AFin = C
Sustituyendo valores tenemos T(1, A, B, C)
T(1, A, B, C) A a C
T(1, A, C, B ) A a B
T(1, C, A, B ) C a B
Paso3: T(N-1, Aux, Ini, Fin)
Esto significa: Mover A a C
T(1, B, C, A) B a A
T(1, B, A, C) B a C
T(1, A, B, C) A a C
¡Excelente!
☺
Algoritmo
/*N = Número de discos */ Ini, Aux, Fin son las varillas.T(N, Ini, Aux, Fin)Begin
If N = 1 thenPrint: Ini -> Fin
ElseCall T(N-1, Ini, Fin, Aux)Call T(1, Ini, Aux, Fin)Call T(N-1, Aux, Ini, Fin)
EndifEnd
Número de movimientos requeridosSi hay N discos entonces acabaremos el juego en un mínimo de:
2n - 1 movimientos
Por ejemplo: N = 3Número mínimo de movimientos necesarios = 2³ - 1 = 7
Conclusión
Las torres de Hanói es un juego con una curiosa y muy bonita historia, además, a pesar de su sencilla manera de solución, dependiendo de ciertos parámetros, como por ejemplo: la cantidad de discos, el procedimiento para llegar hasta el final del juego puede tornarse sumamente largo dejándonos en la necesidad de repetir una gran cantidad de veces las mismas funciones.
Es por esto que resulta una excelente carta de presentación para dar a entender la grandísima utilidad de ciertos principios y conceptos de la programación y una excelente puerta de entrada al mundo de la recursividad para aquellos programadores que se inician.
Es por estas razones que Las Torres de Hanói se han ganado un puesto tan particular y son tema común en el mundo de las ciencias computacionales, y no es para menos, ¿verdad?
¡Juega a las torres de hanói!
Puedes jugar a las torres de hanói en la web accediendo a este enlace:http://www.uterra.com/juegos/torre_hanoi.php