Está en la página 1de 5

Problemas

2.
DISEAR
RECURSIVAMENTE
TRANSFORMAR A ITERATIVO.

Introduccin
En 1883 empez a venderse en Francia un antiguo rompecabezas
oriental, rescatado para Occidente por el profesor N. Claus (de
Siam) y cuyas primeras referencias eran los escritos del ilustre
mandarn Fer-Fer-Tam-Tam. Segn una leyenda india, en el
Templo de Benars, bajo el domo que marca el centro del mundo,
hay una placa de latn con tres agujas de diamante. Durante la
creacin, Dios puso sesenta y cuatro discos de oro puro de distinto
tamao en una de las agujas, formando una torre. Los bramanes
llevan generaciones cambiando de lugar, uno a uno, los discos de
la torre entre las tres agujas de forma que en ningn momento
un disco mayor descanse sobre otro ms pequeo. Cuando hayan
conseguido trasladar todos los discos a otra aguja su trabajo
estar terminado, y la torre y el templo se derrumbarn, y con un
gran trueno, el mundo se desvanecer. La versin simplificada
que se venda en Francia se compona de ocho discos de madera.
En realidad, la Torre de Hanoi y la leyenda india haban sido
inventadas por el matemtico francs douard Lucas (N. Claus
de Siam es un anagrama de Lucas d'Amiens). Su compatriota, el
escritor Henri de Parville ampli y adorn la leyenda poco tiempo
despus. A pesar de que el reto planteado es relativamente
sencillo, la idea de Lucas ha demostrado ser una de las ms
fecundas de la historia de las matemticas recreativas.
Si no lo has hecho antes, antes de seguir leyendo tal vez deberas
familiarizarte con el rompecabezas y resolverlo por ti mismo.
Puedes usar un modelo real o uno de los muchos simuladores que
hay disponibles en Internet.

Notacin
Los discos se numerarn de 1 a 8 (o a n, en general), empezando
por el ms pequeo. Los postes (que se supondrn alineados de

izquierda a derecha) sern marcados con letras maysculas (A, B


y C). El inicial ser A y el objetivo C.

fig. 1
Un algoritmo recursivo
La Torre de Hanoi suele aparecer como ejemplo para ilustrar el
concepto de recursin en los cursos de programacin, ya que
existe un algoritmo recursivo sencillo de descubrir que lo
resuelve. Supongamos que queremos trasladar los ocho discos del
poste A al poste C. Como el disco 8 siempre est abajo del todo, la
nica forma de hacerlo es trasladar primero la torre de siete
discos 1...7 al poste B. Entonces podremos llevar el disco 8 de A a
C, y para terminar tendremos que trasladar de nuevo la torre
1...7, ahora de B a C.
Pero los discos 1...7 forman una torre totalmente similar a la
inicial, as que en dos de los tres pasos anteriores nos
enfrentamos con un problema anlogo al original. De hecho,
puede resolverse de la misma forma, trasladando ahora la torre
1...6. Por ejemplo, el primer paso (trasladar la torre 1...7 de A a
B) se puede descomponer en estos tres pasos.
Por supuesto, en dos de estos tres pasos nos volvemos a encontrar
con el problema original, ahora con n = 6. El proceso no es
infinito, ya que llega el momento en que trasladar una torre
equivale a trasladar un solo disco (esto ocurre cuando la torre es
de un solo disco). En resumen, el algoritmo recursivo es el
siguiente.
Algoritmo para trasladar la torre 1...n del poste X al poste Z,
usando como auxiliar el poste Y.

1. Si n = 1, lleva el disco 1 de X a Z y termina.


2. Traslada la torre 1...n1 usando este mismo algoritmo, de X
a Y, usando como auxiliar Z.
3. Lleva el disco n de X a Z.
4. Traslada la torre 1...n1 usando este mismo algoritmo, de Y
a Z, usando como auxiliar X.
Este es ms la definicin de un problema que su resolucin. En
realidad, lo nico que hace es especificar unos pasos inevitables.
Por ejemplo, como vimos antes, para resolver el puzzle es
obligatorio llevar el disco n de A a C, y para ello es obligatorio
llevar antes la torre 1...n a B, etc. La secuencia de movimientos
que produce este algoritmo es la nica solucin ptima (o sea, de
longitud mnima) posible. El nmero de movimientos es M(n) =
2n1, como se puede demostrar fcilmente por induccin sobre el
nmero de discos.
Se cumple para n = 1
M(1) = 1 = 211.
Si se cumple para n, se cumple para n+1
Al ejecutarse el algoritmo para n+1 se llama a s mismo dos veces
para n, ms un movimiento del disco n+1. As que
M(n+1) = 2 M(n) + 1 = 2 (2n1) + 1 = 2n+12+1 = 2n+11.
Para n = 8 el nmero de movimientos es de 281 = 255. Para n =
64, de 2641 = 18.446.744.073.709.551.615. Si los bramanes de
Benars cambiaran un disco de sitio cada segundo necesitaran
ms de quinientos ochenta mil millones de aos para terminar su
tarea, unas cuarenta veces la edad del Universo.
Obtencin de un algoritmo iterativo
Los algoritmos recursivos funcionan bien con ordenadores, pero
son difciles de aplicar para un ser humano. Si intentas resolver
la torre de ocho discos aplicando el mtodo descrito es fcil que te
pierdas a no ser que vayas tomando notas de por dnde vas.
Incluso para los ordenadores los algoritmos recursivos suelen ser
poco econmicos, en el sentido de que consumen bastante
memoria (como ya hemos comentado en clase la memoria es como

poco la altura del rbol de llamadas). La alternativa a los


algoritmos recursivos son los iterativos. Muy a menudo no existe
o no se conoce una alternativa iterativa para un algoritmo
recursivo, y cuando s se conoce, suele ser mucho ms complicada
que la versin recursiva. Sin embargo, en el caso de la Torre de
Hanoi, existen varios algoritmos iterativos que uno puede
encontrar tecleando Torres de Hanoi en el google.
No obstante, lo que aqu tratamos es de derivar una solucin
iterativa utilizando tcnicas profesionales y no ser dependientes
en exclusiva de nuestro ingenio.
Para ello se propone que sigas los siguientes pasos.
1.- Modelar el problema. Ello exige elegir los tipos de datos
necesarios para modelar las torres y luego modelar el juego.
Especifica completamente los tipos de datos. Implementa un
prototipo para los mismos. Puedes utilizar tipos ya hechos y cuyo
manejo conozcas o implementar tus propios tipos.
2.- Especificar el juego usando los tipos de datos de la
parte 1.
3.- Describir, dentro del modelo que hayas fabricado el
algoritmo recursivo que se ha explicado anteriormente.
En este momento ya puedes disponer de un prototipo recursivo
que funcione.
4.- Identificar de que tipo de recursividad se trata.
5.- Podemos pensar que cada nodo del rbol de llamadas contiene
la representacin de un estado del juego. Describir cada nodo, las
operaciones hijoIzquierdo, hijoDerecho, y en que consiste el
tratamiento de cada nodo (/** aqu no se programa */)
6.- Describe el algoritmo recursivo en trminos de operaciones
sobre el rbol de llamadas e identifica de que tipo de recorrido se
trata. (/** aqu tampoco se programa */)
7.- Finalmente, aplica la transformacin adecuada al recorrido y
da un algoritmo iterativo. Para ello puedes revisar tus
conocimientos de estructuras de datos o en su defecto no sera
malo consultar algn libro. Puede valer el libro de Jos Luis

Balczar, Programacin metdica, sobre todo la parte de rboles


y recursividad. (/** aqu tampoco se programa **/)
8. Implementa la versin iterativa y comprala con la recursiva.
Relata brevemente las conclusiones experimentales explicndolas
a travs de argumentos de la teora.

También podría gustarte