Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Jesús Ravelo
Cristina Zoltan
Dpto. de Computación y Tecnologı́a de la Información
Universidad Simón Bolı́var
Caracas, Venezuela
(Borrador)
23 de enero de 2001
1
Hanoi 2
2 Marco Conceptual
El proceso consiste en trasladar la pila de discos, todos de diametro diferente,
del pin ORIGEN al pin DESTINO. Esto nos llevarı́a de la situación que
vemos en la figura 1 a la de la figura 2. Si tuviesemos una grúa capaz de
levantar todos los pines lo harı́amos en un solo movimiento. Pero las reglas
del juego permiten mover un solo disco a la vez.
4.0in2.2inc:/cris/hanoi/inicial.bmp
4.0in2.2inc:/cris/hanoi/final.bmp
Las reglas del juego nos permiten mover un solo disco a otro pin, con
la restricción que un disco puede colocarse en un pin que está vacı́o o tiene
disco superior de diámetro mayor al que estamos colocando.
– N >0.
– El pin ORIGEN tenga al menos N discos: |ORIGEN | ≥ N .
– El pin DESTINO pueda recibir los discos que se envı́an:
– Pin de origen.
– Pin de destino.
(v) Este operador es válido si preserva las reglas del juego. Por lo tanto,
también se requiere que:
3 Recursión
Una técnica muy usual en computación para la solución de problemas es la
técnica de recursión. Este método consiste en tratar de resolver un proble-
ma de tamaño N en base a acciones que incluyan la resolución del mismo
problema, pero de tamaño menor. Este mecanismo es efectivo siempre que
se conozca una solución para el problema dado de tamaño pequeño.
En el caso de las torres de Hanoi, el tamaño del problema puede pensarse
que es el número de discos a trasladar, y es claro que HANOI (1, A, B, C)
es igual a MOVER (A, B) . Esta certeza de saber cómo resolver el problema
para tamaños reducidos se conoce como la terminación de la recursión.
Hanoi 5
4.0in2.2inc:/cris/hanoi/linea1.bmp
4.0in2.2inc:/cris/hanoi/linea2.bmp
4.0in2.2inc:/cris/hanoi/linea3.bmp
HANOI(k,A,B,C)
begin
{ A = A0 k A1 ∧ |A0 | = k > 0 ∧ B = B0 ∧ C = C0 }
( )
(como k > 0 , tenemos que A0 puede ser expresado como A00 k hxi )
A = A00 k hxi k A1 ∧ |A00 | = k − 1 ≥ 0 ∧ B = B0 ∧ C = C0
si k=1 entonces
( )
(como k = 1 , tenemos que A00 = hi )
A = hxi k A1 ∧ B = B0 ∧ C = C0
MOVER(A,B)
{ A = A1 ∧ B = hxi k B0 ∧ C = C0 }
{ A = A1 ∧ B = A00 k hxi k B0 ∧ C = C0 (pues A00 = hi ) }
sino
begin
( )
(en este caso se cumple k > 1 )
A = A00 k hxi k A1 ∧ |A00 | = k − 1 > 0 ∧ B = B0 ∧ C = C0
HANOI(k-1,A,C,B);
{ A = hxi k A1 ∧ B = B0 ∧ C = A00 k C0 ∧ |A00 | = k −1 > 0 }
MOVER(A,B);
{ A = A1 ∧ B = hxi k B0 ∧ C = A00 k C0 ∧ |A00 | = k −1 > 0 }
HANOI(k-1,C,B,A)
{ A = A1 ∧ B = A00 k hxi k B0 ∧ C = C0 }
end
{ A = A1 ∧ B = A00 k hxi k B0 ∧ C = C0 }
{ A = A1 ∧ B = A0 k B0 ∧ C = C0 (pues A00 k hxi = A0 ) }
end
Note que las anotaciones indican que efectivamente se han trasladado los
k discos del tope del pin A al pin B dejando inalterado el pin C.
Es importante volver a destacar la necesidad de disminuir el tamaño del
problema en las llamadas recursivas, es decir, en las llamadas al mismo proce-
dimiento con el que se está resolviendo el problema. En nuestro caso, vemos
que la solución propuesta para HANOI de tamaño k sólo hace llamadas a
HANOI para problemas de tamaño k − 1. La correctitud de esta solución
recursiva depende fuertemente de este hecho, lo cual está estrechamente re-
lacionado con la noción de función de cota para demostrar correctitud de
soluciones iterativas. Para iteraciones, las demostraciones de correctitud re-
quieren el uso de una función de cota que garantice terminación; usualmente
ésta es una función entera que decrece estrictamente en cada iteración y que
está acotada inferiormente. En nuestra solución de HANOI, el tamaño k
del problema cumple el rol de la función de cota: cada llamada recursiva se
realiza para un valor estrictamente menor; y la cota inferior es 1, valor para
el cual resolvemos el problema sin utilizar recursión.
Por último, veamos que, de acuerdo a la semántica especificada para HA-
NOI, hemos resuelto nuestro problema inicial. Si tenemos un pin ORIGEN
no-vacı́o con N discos, y pines DESTINO y AUXILIAR vacı́os, se estarı́a
cumpliendo la condición
ORIGEN = ORIGEN 0 ∧ |ORIGEN | = N > 0
DESTINO = hi
AUXILIAR = hi
serı́a suficiente.
Con tal pre-condición, estarı́amos instanciando nuestra solución mediante
la substitución
5 Complejidad de la solución
Por razones de completitud del análisis y solución de un problema, presen-
tamos brevemente el análisis de la complejidad de la solución obtenida.
Llamemos H(N ) al número de operaciones requeridas para solucionar un
problema HANOI de tamaño N , y asumamos que el número de operaciones
que realiza MOVER es una constante C. Vemos entonces que podemos
expresar H(N ), según la solución presentada, como
(
C si N = 1 ,
H(N ) =
2 ∗ H(N − 1) + C si N > 1 .
H(N ) = 2 ∗ H(N − 1) + C
= 2 ∗ (2 ∗ H(N − 2) + C) + C
= 22 ∗ H(N − 2) + 2 ∗ C + C
= 22 ∗ (2 ∗ H(N − 3) + C) + 2 ∗ C + C
= 23 ∗ H(N − 3) + 22 ∗ C + 2 ∗ C + C
= 23 ∗ (2 ∗ H(N − 4) + C) + 22 ∗ C + 2 ∗ C + C
Hanoi 10
= 24 ∗ H(N − 4) + 23 ∗ C + 22 ∗ C + 2 ∗ C + C
= ...
Esta exploración sugiere que, en el caso general, se cumple que:
H(N ) = 2i ∗ H(N − i) + ( j : 0 ≤ j < i : 2j ∗ C) si N > i .
P
= { pues H(1) = C }
N −1
2 ∗ C + ( j : 0 ≤ j < N − 1 : 2j ∗ C)
P
= { resolviendo la sumatoria }
(2N − 1) ∗ C .
Hemos demostrado entonces que, en el caso general, se cumple
H(N ) = (2N − 1) ∗ C .
El caso particular del tiempo requerido por los monjes de Hanoi para
mover los 64 discos de oro de los pines resulta ser un valor de 20 cifras signi-
ficativas multiplicado por el tiempo requerido para mover un disco. Si somos
optimistas y consideramos que los monjes mueven un disco por segundo, sin
detenerse ni de dı́a ni de noche, podemos estar tranquilos ya que la desapa-
rición del mundo, pronosticado en el mito, tardarı́a aún unos seis millardos
de centurias.
6 Bibliografı́a
1. ABERNETHY, Kenneth & ALLEN, J. Thomas, “Exploring the Science
of Computing, A Laboratory Approach with PASCAL”. PWS Publis-
hing Company, Boston, Massachusetts, 1994.
Hanoi 11