Sie sind auf Seite 1von 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.

Das könnte Ihnen auch gefallen