Вы находитесь на странице: 1из 26

RECURSIÓN E ITERACIÓN EN ALGORITMOS:

EL CASO LA TORRE DE HANOI

por

Vanessa Santiago Olivares

Monografía sometida en cumplimiento parcial


de los requisitos para el grado de

MAESTRO EN CIENCIAS

en

MATEMÁTICA APLICADA

Universidad Interamericana
Recinto de San Germán
Departamento de Matemáticas
2010

Aprobado por:

_______________________________________
Dr. Balbino García
Director del Proyecto Creativo
Resumen

Este documento presenta una comparación entre algoritmos recursivos


e iterativos utilizando como ejemplo el problema de la Torre de Hanoi.
De acuerdo a la literatura, ambos métodos de programación se pueden
adaptar a los mismos problemas pero, en general, los algoritmos
recursivos son más simples y toman mayor tiempo de ejecución. El
problema de la Torre de Hanoi, en su formato original, consiste de tres
columnas paralelas. En una de las columnas se colocan discos
concéntricos de diferentes diámetros de forma que la columna pasa
por el centro de los discos y los discos están apilados en orden
ascendente de diámetro, es decir, el disco de menor diámetro está
arriba y el de mayor diámetro abajo. El objetivo es mover los discos de
una columna a otra. Para esto se imponen las restricciones de que (1)
sólo se puede mover un disco a la vez, y (2) los discos sólo se pueden
colocar en espacios vacíos o sobre discos de mayor diámetro. Para
realizar la comparación se construyeron dos algoritmos, uno recursivo
y otro iterativo, en Mathematica 7.0.0, y se comparó su ejecución. El
algoritmo recursivo requirió menos líneas de código que el iterativo, lo
cual va de acuerdo a lo reportado en la literatura en el sentido de que
los algoritmos recursivos son más simples que los iterativos. Para
evaluar el tiempo de ejecución, se calculó la razón de tiempo de
ejecución a cantidad de discos y se normalizó a la razón para tres
discos. Los resultados sugieren que, en efecto, el tiempo de ejecución
para el algoritmo recursivo es mayor que para el iterativo.

Palabras clave: Algoritmos, Recursión, Torre de Hanoi

2
Abstract

This document presents a comparison between recursive and iterative


algorithms using problem of the Tower of Hanoi as example. According
to literature, both programming methods can be adapted to similar
problems but, in general, recursive algorithms are simpler but require
longer run times. The problem of the Tower of Hanoi, on its original
format, consists of three parallel columns. In one of the columns,
concentric discs of different diameters are stacked so that the column
goes through the center of the discs. Discs are piled up in ascending of
diameter, that is, the disc with smaller diameter on top and the one of
greater diameter at the bottom. The objective is to move the stack of
discs from a column to another one. The following two restrictions are
imposed to accomplish this objective: (1) only one disc can be moved
on each turn, and (2) the discs can only be placed in empty spaces or
over discs of greater diameter. In order to make the comparison two
algorithms were constructed in Mathematica 7.0.0, one recursive and
another iterative one, and their performance compared. The recursive
algorithm required less lines of code than the iterative one, which
agrees with reported literature in the sense that the recursive
algorithms are simpler that the iterative ones. In order to evaluate the
run time, the rate of run time to amount of discs was calculated and
standardized to the rate for three discs. The results suggest that, in
fact, the run time for the recursive algorithm is greater than for the
iterative one.

Key words: Algorithms, Recursion, Tower of Hanoi

3
Tabla de Contenido

Algoritmos……………………………………………………………………… 5
………………..
Recursión e Iteración 8
………………………………………………………………………….
Torre de Hanoi 10
…………………………………………………………………………………..
Solución Gráfica de la Torre de Hanoi 13
………………………………………….
Solución Recursiva de la Torre de Hanoi 15
………………………………………
Solución Iterativa de la Torre de Hanoi 16
………………………………………..
Análisis de Resultados 19
…………………………………………………………………………
Conclusión……………………………………………………………………… 21
…………………
Referencias……………………………………………………………………… 22
……………….

4
Algoritmos

La Real Academia de la Lengua Española define un algoritmo como un


“conjunto ordenado y finito de operaciones que permite hallar la
solución de un problema” (RAE, 2001).

La palabra surge del nombre del matemático persa Muhammad ibn


Musa al-Jwarizmi que se estima vivió entre los años 780 y 850 y a
quien se considera como el padre del álgebra y nuestro sistema de
numeración. Al-Jwarizmi fue matemático, astrónomo y geógrafo. Su
principal logro consistió en publicar libros de fácil comprensión que
permitían el aprendizaje y aplicación de los conocimientos en
matemática por un mayor número de personas. En sus tratados
enfatizó que especificar de forma clara y concisa la manera
sistematizada de realizar cálculos llevaba a la definición de algoritmos
que podían ser usados en dispositivos mecánicos como los ábacos.
Esto lo llevó a estudiar los modos de reducir las operaciones que
componían los cálculos, es decir, el “conjunto ordenado y finito de
operaciones que permite hallar la solución de un problema” (Dávila-
Rascón, 2002).

El estudio de los algoritmos y los efectos de factores externos sobre el


desempeño de estos se conoce como algoritmia. De acuerdo a esta
ciencia, los algoritmos de computación y matemáticas se pueden
clasificar, según su función, en dos tipos principales: de ordenamiento
y de búsqueda. Los algoritmos de ordenamiento colocan los
elementos de una lista o vector en un orden específico siguiendo una
serie de reglas preestablecidas. Estos son la base de de procesos como
bases de datos, análisis del escenario mejor, peor o promedio y
análisis de límite inferior (algoritmia.org, 2010).

Existen varias subclases para los algoritmos de ordenamiento.

• Interno versus externo: Si el ordenamiento de lleva a cabo en la


memoria (RAM) de la computadora se le llama interno.
Algoritmo externo sería aquel en que el ordenamiento se lleva a
cabo en otro lugar, por ejemplo, un disco duro.
• Natural versus no-natural: Esta es una clasificación en términos
del tiempo que toma el ordenamiento. Esto depende de si los
datos de entrada ya tienen una estructura ordenada (natural) o
hay que generar dicha estructura para entonces ordenar (no-
natural).
• Estable versus inestable: La estabilidad del algoritmo se refiere a
su capacidad de tratar con datos que tienen las mismas claves
de ordenamiento, por ejemplo, un algoritmo que ordene por
5
apellido y se encuentra con elementos de información que tienen
el mismo apellido. En este caso, el algoritmo estable va a
mantener el orden de los elementos según apareen en el listado
de entrada mientras que el inestable no lo mantiene.

Los algoritmos de búsqueda, por su parte, pretenden determinar si un


elemento en particular existe dentro de un conjunto, listado o vector
de datos. Este algoritmo se reduce a la aplicación de lógica boleana
para encontrar el elemento de interés. Estos algoritmos pueden ser de
tipo secuencial o binario. Algoritmos de tipo secuencial se utiliza
cuando no hay garantía de que el conjunto de datos esté ordenado.
Esta condición hace necesario el pasar por todo el conjunto para
evaluar cada uno de los elementos. Por el contrario, si el conjunto de
datos está ordenado por el criterio de interés, usando un algoritmo
binario es posible ir específicamente al lugar donde podría estar el
elemento buscado y determinar si está presente o no en el conjunto.
Esto hace que los algoritmos de búsqueda binarios sean mucho más
eficientes en términos del tiempo de procesamiento (algoritmia.org).

Otra manera de clasificar los algoritmos es en base a la técnica


utilizada (Brassard y Bratley, 1996; Wikipedia.org, 2010). Técnica se
refiere a la forma en que se construye el algoritmo para enfrentar el
problema y tomar decisiones que lleven a la solución correcta o el
mejor estimado posible de dicha solución. Desde esta perspectiva se
consideran las siguientes clases.

• Exacto versus aproximado: Se refiere al tipo de solución que


pretende ofrecer el algoritmo. La selección de uno sobre otro
depende de la complejidad del problema y la incertidumbre de
los factores externos.

• Determinístico versus no-determinístico: Algoritmo


determinístico o estático es un algoritmo lineal, tipo receta de
cocina, que hace siempre lo mismo sin tomar en cuenta
decisiones o con opciones previamente definidas. Cada paso del
algoritmo tiene únicamente un paso sucesor y otro antecesor y
siempre produce el mismo resultado al enfrentar el mismo
conjunto de datos iniciales. Los no-determinísticos, por otro lado,
son algoritmos que tienen la capacidad de tomar decisiones en
base a parámetros aleatorios (o semi-aleatorios) que cambian
cada vez que se ejecutan. Esto permite que el mismo algoritmo
aplicado a los mismos datos pueda ofrecer resultados diversos.

• En serie, paralelo o distribuidos: Algoritmos que se ejecutan un


paso a la vez se conocen como seriados o en serie. Los
algoritmos paralelos y distribuidos dividen los problemas en
6
subproblemas, o partes menos complejas, y resuelven cada
parte de forma individual y simultánea utilizando varios
sistemas. La diferencia entre algoritmos paralelos y distribuidos
radica en la arquitectura de los sistemas en los que pueden
operar. Los algoritmos paralelos operan en sistemas con varios
procesadores mientras que los distribuidos operan en redes de
computadoras interconectadas. Ambos son algoritmos de alto
nivel que utilizan otros algoritmos para resolver los
subproblemas e integrar sus soluciones.

• Lógicos: Se clasifican como algoritmos lógicos a aquellos que


operan en función de los conceptos y axiomas de la matemática
lógica.

• Recursión versus iteración: Para llegar a la solución deseada, los


algoritmos son comúnmente utilizados en varias ocasiones
durante el procesamiento de los datos. Cuando el algoritmo
termina y vuelve a correr, se dice que está iterando. Por otro
lado, cuando el algoritmo se llama a si mismo para resolver
parte del problema, se dice que está recurriendo.

Otra posible clasificación de los algoritmos es en base al paradigma de


implementación, es decir, la forma en que va a determinar la solución
al problema bajo consideración. En términos generales, existen las
siguientes categorias (Brassard y Bratley, 1996; Wikipedia.org, 2010).

• Solución por fuerza bruta o búsqueda exhaustiva: Este término


se utiliza para denominar algoritmos que exploran todas las
posibles combinaciones para alcanzar la solución óptima.

• Algoritmo ambicioso (“greedy”): Son algoritmos simplistas que


toman decisiones en base a la información disponible de forma
inmediata y que es pre-definida. Esto permite que sean
eficientes, fáciles de desarrollar e implantar, pero su simplicidad
no se adapta a muchas situaciones de la vida real y, por tanto,
típicamente su solución no es óptima. Su uso principal son los
problemas de optimización tales como la ruta más corta o el
costo más bajo.

• Divide y vencerás: En esta técnica se divide el problema en


subconjuntos que se resuelven sucesivamente y de forma
independiente. Las soluciones parciales se combinan finalmente
para obtener la solución al problema bajo consideración.

7
• Programación dinámica: Es una técnica similar a “divide y
vencerás” con la diferencia de que los subconjuntos o
subproblemas que trata no son totalmente independientes, sino
que tienen cierto grado de solapamiento.

• Programación lineal: Utiliza un sistema de ecuaciones y


desigualdades que acotan y definen el universo. Estos
algoritmos utilizan matemática lineal para hallar la solución
óptima del sistema.

• Heurísticas: Estos algoritmos se utilizan para encontrar


estimados (soluciones subóptimas) de las soluciones reales en
base a experiencias previas del algoritmo y factores aleatorios.

• Grafos: Algoritmos basados en la teoría de grafos para modelar


sistemas y resolverlos en base a las restricciones impuestas
sobre estos.

Recursión e Iteración

Como se mencionó anteriormente tanto la recursión como la iteración


buscan que el algoritmo se ejecute en forma secuencial y consecutiva
un cierto número de veces. La diferencia entre éstas estriba en que la
iteración ejecuta el algoritmo completamente antes de volverlo a
llamar, mientras que la recursión llama al mismo algoritmo para poder
resolverlo. Rosen (2003) establece claramente la diferencia entre
ambas técnicas con el ejemplo que se presenta a continuación y
sugiere que la iteración es mucho más efectiva en términos de tiempo
de computación.

Rosen toma como ejemplo el cómputo del factorial de un número n.


Por definición, n! = n(n −1)(n −2)...(1). En base a esto es posible
establecer un algoritmo recursivo en C++ que tenga la siguiente
estructura.

8
PROCEDURE factorial(n)
{
IF n = 1
{
nfac = 1
}
ELSE
{
nfac = n*factorial(n-1)
}
RETURN(nfac)

Para visualizar la recursividad de este algoritmo, asumamos que n = 4.


Este valor entra al algoritmo y se dispone a evaluar nfac =
n*factorial(n - 1). Esta ecuación manda a que se evalúe cuanto es
factorial(n - 1) antes de proceder. Entonces se llama el algoritmo por
segunda vez pero con n = 3. Esta vez, el algoritmo requerirá evaluar
factorial(n - 1) con n = 2 y recurrirá al algoritmo por tercera vez. El
proceso continúa hasta que en la cuarta recursión se define que
factorial(n - 1) con n = 1 resulta en un valor concreto y permite que las
incógnitas anteriores se puedan evaluar.

Debe resultar evidente que la recursión causa que haya valores


intermedios que no se pueden evaluar hasta que la recursión se acota.
Es entonces cuando el proceso puede regresar y concluir los ciclos
computacionales externos. El tener que trabajar con valores
intermedios que no pueden ser evaluados completamente requiere de
espacio de memoria para almacenar dichos valores y tiempo de
computación adicional.

A modo de comparación, la implementación del cómputo del factorial


de n usando un algoritmo iterativo aparece a continuación.

PROCEDURE factorial(n)
{
nfac = 1
FOR i = 1 TO n
{
nfac = nfac*i
}
RETURN(nfac)

A diferencia del caso anterior, cada ciclo termina sin dejar incógnitas o
valores intermedios sin analizar. Veamos, por ejemplo, el caso para n

9
= 4. Al entrar en el algoritmo, se asigna un valor inicial de 1 a nfac y
se define en valor del índice de iteración, i. Esto permite que al evaluar
la ecuación se obtenga un resultado concreto cada vez.

A pesar de la simpleza de la iteración, la recursión tiene su lugar el las


matemáticas y la computación ya que en algunos sistemas hay una
dependencia tal entre los estados presente, pasado y futuro que
requiere la evaluación de los diferentes estados para poder definir la
solución.

Goodstein (1964), hablado de la teoría recursiva de números,


establece una analogía entre el juego de ajedrez y la aritmética. De
acuerdo a esta discusión, las fichas del juego se pueden comparar con
los numerales y los movimientos de dichas fichas con las operaciones
y propiedades de cada numeral. Goodstein razona que el la pieza
denominada rey, no es rey debido a su forma o construcción ya que el
objeto puede ser reemplazado por cualquier otro y funcionar igual.
Siendo así, lo que hace al rey ser tal, son las reglas que definen sus
movimientos particulares. Entonces, cualquier objeto que actúe como
rey, se puede usar como tal. De igual forma, cualquier símbolo se
puede utilizar para representar al 2, lo importante es que las
propiedades y efecto al interactuar en operaciones con otros
numerales sean las propias de esa figura.

Esta analogía sirve para plantear la bondad de los algoritmos


recursivos sobre los iterativos. En el ajedrez, un algoritmo iterativo
sólo serviría para mover piezas sin más lógica que siguiendo las
operaciones permitidas. En cambio, un algoritmo recursivo permitiría
la consideración de otras piezas en el tablero y las posibles
consecuencias o estados futuros antes de alcanzar una solución.

La literatura contiene un sin número de trabajos que documentan los


principios y conceptos de la llamada teoría de recursión (Crossley,
1967; Fenstad, 1980; Goodstein, 1964; Greenberg, 2006; Hinman,
1978; Nerode y Shore, 1984) al igual que los principios y aplicaciones
de la iteración en las matemáticas y computación (Axelsson, 1994;
Beardon, 1991; Palais y Palais, 2009; Norris, 1981).

Torre de Hanoi

La Torre de Hanoi, también conocida como la Torre de Brahma, es un


juego inventado por el matemático francés François Edouard Anatole
Lucas en 1883, quien, además de su trabajo en matemática
recreacional, es conocido por su contribución relacionada a la
secuencia Fibonacci y los algoritmos para determinar si los números
son primos (O’Connor y Robertson, 1996).

10
El juego de la Torre de Hanoi (Figura 1), en su formato original,
consiste de tres columnas paralelas. En una de las columnas se
colocan discos concéntricos de diferentes diámetros de forma que la
columna pasa por el centro de los discos y los discos están apilados en
orden ascendente de diámetro, es decir, el disco de menor diámetro
está arriba y el de mayor diámetro abajo. El objetivo del juego es
mover los discos de una columna a otra. Para esto se imponen las
restricciones de que (1) sólo se puede mover un disco a la vez, y (2)
los discos sólo se pueden colocar en espacios vacíos o sobre discos de
mayor diámetro.

Figura 1: Juego de la Torre de Hanoi

Aunque el juego típicamente tiene ocho discos, en la Internet se


consiguen variaciones del juego que van desde tres hasta 12 discos.
Otras variaciones del juego definen o limitan la columna a la cual se
desea mover los discos, el tiempo disponible para hallar la solución, la
dirección del movimiento o la cantidad de movidas para alcanzar el
objetivo.

En relación al número de movidas mínimo para alcanzar el objetivo,


Valeiras (2004) reporta que la solución óptima, es decir, el menor
número de movidas para alcanzar la solución final, es 2n-1, donde n es
el número de discos en el juego. La Figura 2 presenta como el número
mínimo de movidas crece exponencialmente con el número de discos
en el juego.

11
300
Movidas mínimas
250 8

200

150
7
100
6
50
5
3 4
0 1 2
0 2 4 6 8
Número de discos
Figura 2: Número mínimo de movidas para la solución óptima según la
cantidad de discos en el juego

Es interesante notar como la observación cuidadosa del número


mínimo de movidas requerido para alcanzar la solución sugiere la
recursividad del problema. De acuerdo a la Tabla 1, para tres
columnas (k=3), para poder alcanzar la solución al problema con n
discos, es necesario resolver el problema para n-1 discos primero. Se
puede demostrar también que M(n)=2(M(n-1))+1=2n+1. (Snapp, 2005)

12
Tabla 1: Movidas necesarias para alcanzar la solución óptima
Número de Solución Número de
M(n) = f(M(n-
discos óptima movidas
1))
(n) H(n,3) = 2n+1 M(n)
1 1 1 --
2 3 2(1)+1 2M(1)+1
3 7 2(2(1)+1)+1 2M(2)+1
2(2(2(1)+1)+1)+
4 15 2M(3)+1
1

Otras variantes aumentan el número de columnas (por ejemplo,


‘Reve’s puzzle’ es una variante con cuatro columnas) (Houston y
Masum, 2004) o la cantidad de conjuntos de discos a mover (Mascolo,
2007). Estas variantes aún se siguen estudiando y para muchas de
ellas no se han identificado soluciones tales como el número mínimo
de movimientos para mover de una columna a otra.

Berend y Sapir (2006), por ejemplo, estudiaron el problema para, dado


alguna variante del juego y cantidad de discos específico, hallar el
diámetro del grafo o número máximo de pasos para mover los discos
de una configuración inicial a otra final previamente especificada.

Para el caso particular del problema con cuatro torres, Frame (1941) y
Steward (1941) reportaron acerca de un algoritmo que proveía la
solución presuntamente óptima. Sin embargo, dicha solución estaba
basada en la llamada conjetura Frame-Steward que dice que
FS(n,k)=H(n,k), es decir, que el resultado del algoritmo para n discos y
k columnas es realmente la solución óptima. En otras palabras, la
solución que provee el algoritmo parece ser óptima, pero no se ha
podido probar, ni negar, que en realidad lo es. Chen y Shen (2004)
retaron esta paradoja y probaron que FS(n,k) y H(n,k) son de la misma
magnitud, lo que ellos llamaron la evidencia más contundente en
apoyo a la conjetura Frame-Steward.

Figura 3: Solución óptima de Frame-Steward para la Torre de Hanoi (Shen, 2004)

Stockmeyer y Lunnon (2008) presentan diversas variaciones del


problema con más de un conjunto de discos, donde cada conjunto
tiene un color particular. Para cada caso explorado, los autores
proveen claves de cómo hallar la solución y algoritmos para poder

13
resolver los problemas. No reclaman, sin embargo, que sus soluciones
sean óptimas.

El problema de la Torre de Hanoi ha sido estudiado usando diferentes


algoritmos o implementaciones de dichos algoritmos. Wikipedia, por
ejemplo, presenta algoritmos binarios, no-recursivos y sub-óptimos
para solucionar el problema. El algoritmo también ha sido
implementado en juegos de video y secuencias de almacenamiento de
datos en memorias de computadoras y ordenadores.

SOLUCIÓN GRAFICA DE LA TORRE DE HANOI

Al igual que cualquier otro problema que se desee resolver usando


algoritmos recursivos o iterativos, la clave esta en poder identificar un
subproblema que al repetir la secuencia nos lleve a la solución final.
En el caso de soluciones recursivas, el subproblema debe ser
esencialmente una copia reducida del problema mayor. Este es
básicamente el concepto de los modelos fractales de Sierpinski.

Asumamos que tenemos una Torre de Hanoi con tres columnas (A, B,
C) y tres discos. Para propósitos del grafo, asumamos la siguiente
nomenclatura. Los discos aumentan de tamaño de izquierda a
derecha, es decir, el disco menor está a la izquierda. Además, la
localización de disco se identificará con el nombre de la columna. De
esta forma, la notación ABC indica que el disco mayor está en la
columna A, el segundo disco en la columna B y el disco menor en la
columna C.

14
AAA

AAB AAC

ACB ABC

ACC ACA ABA ABB

BCC CBB

BCA BCB CBC CBA

BCB BAB CAC CCA

BBB BBC BAC BAA CAA CAB CCB CCC

Figura 4: Modelo fractal de Sierpinski que sirve como grafo de la solución


al problema de la Torre de Hanoi

La Figura 4 muestra el modelo fractal de Sierpinski que representa la


solución gráfica al problema de la Torre de Hanoi. Nótese que los
vértices de la estructura externa (triángulo) son las condiciones en que
los tres discos están en la misma columna. Se aprecia, además, que el
triángulo externo está formado por tres triángulos internos siguiendo
el arreglo de Sierpinski, y que estos, a su vez, están formados por
triángulos más pequeños.

De este modelo, es posible establecer que el paso más corto (óptimo)


para pasar los discos de A hasta C (Figura 4) es AAA-AAC-ABC-ABB-
CBB-CBA-CCA-CCC y que consta de siete pasos solamente. Esto
concuerda con el número mínimo de 2n - 1 (23 - 1 = 8 – 1 = 7)
mencionado anteriormente.

15
AAA

AAB AAC

ACB ABC

ACC ACA ABA ABB

BCC CBB

BCA BCB CBC CBA

BCB BAB CAC CCA

BBB BBC BAC BAA CAA CAB CCB CCC

Figura 5: Paso óptimo entre A y C

De este grafo es posible obtener otros pasos de interés, por ejemplo, el


paso Hamiltiniano, es decir, el paso que lleve el conjunto de discos a
todas las columnas y los regrese al principio. Hinz y Parisse (2002)
probaron que todo grafo de Hanoi es Hamiltoniano isomórfico y
realizaron un análisis exhaustivo de su planaridad.

Otros pasos de interés son el paso más largo y el paso del vendedor
viajero que pasa por todos los puntos del grafo una sola vez y regresa
al origen. Además, es posible establecer un paso que lleve los discos
desde cualquier configuración inicial permitida hasta la solución final.

16
SOLUCIÓN RECURSIVA DE LA TORRE DE HANOI

En términos generales, la literatura reporta el siguiente algoritmo para


hallar la solución al problema de la Torre de Hanoi con tres torres
(identificadas como origen, intermediaria y destino) (McCann, 2007;
Snapp, 2005; Valerias, 2004; Wikipedia, 2010).

1. Mover el disco menor a la columna intermediaria si hay un


número par de discos. Si hay un número impar de discos, mover
el disco menor a la columna destino.
2. Hacer un movimiento legal que no sea reversar el paso anterior
(sólo debe haber una posibilidad).
3. Mover el disco menor a la columna de la cual no provino en su
movimiento anterior.
4. Repetir los pasos dos y tres hasta mover todos los discos.

De forma recursiva, este algoritmo se pude expresar como sigue.

1. Mover los n-1 discos superiores de la columna origen a la


columna intermediaria usando la columna destino como
intermediaria.
2. Mover el disco n a la columna destino
3. Mover los n-1 discos superiores de la columna intermediaria a la
columna destino usando la columna origen como intermediaria.

La Figura 6 presenta un algoritmo recursivo programado en


Mathematica 7.0.0 para resolver el problema de la Torre de Hanoi con
tres torres. Dicha implementación es una adaptación realizada por la
autora del algoritmo publicado por Weisstein (2006).

El algoritmo de la Figura 6 comienza con la asignación de la cantidad


de discos en el juego; información que se guarda en la variable Discos.
La cantidad de torres está fija a tres, de acuerdo a la versión original
del problema. Con esta cantidad de discos, se procede a calcular la
secuencia óptima de juego. Nótese que la recursión del programa está
en la función movida que, para poder evaluarse, requiere llamarse a si
misma.

La Figura 6 presenta además la solución del algoritmo para una corrida


con tres discos. En la matriz resultante, cada columna de la matriz
representa una torre del juego. Las filas de la matriz representan la
secuencia de pasos a ejecutar para llegar a la solución. A la izquierda
de la matriz aparece el valor 1.37694 *10-17. Este valor corresponde al
tiempo de ejecución del algoritmo para llegar a la solución.

17
Figura 6 Algoritmo recursivo para la solución óptima de la Torre de Hanoi

SOLUCIÓN ITERATIVA DE LA TORRE DE HANOI

El algoritmo recursivo presentado anteriormente fue modificado por la


autora para convertirlo en un algoritmo iterativo. El algoritmo
modificado aparece en la Figura 7 y su solución para la torre con tres
discos aparece en la Figura 8.

Al igual que el algoritmo recursivo, esta implementación comienza con


la asignación de la cantidad de discos a la variable Discos. Luego se
determina la el orden en que se van a mover los discos. Finalmente,
se entra en un proceso iterativo que genera la secuencia de pasos
necesarios para llegar a la solución óptima.

18
Parte de la simpleza del algoritmo radica en que el patrón de
movimiento de los discos, una vez reconocidos, se repite para los
diferentes discos. Por ejemplo, cuando hay una cantidad par de
discos, todos los discos pares se mueven de la primera columna a la
segunda, luego a la tercera y regresan a la primera. En cada
movimiento del disco, se moverá de columna en columna siguiendo
este patrón.

19
Figura 7 Algoritmo iterativo para la solución óptima de la Torre de Hanoi

Los resultados del algoritmo iterativo para el caso de tres discos se presentan en
la Figura 8. Cada matriz representa la condición de las torres (columnas de la
matriz) en cada paso de la secuencia.

20
Figura 8 Resultado arrojado por el algoritmo iterativo para el caso de tres (3) discos

Análisis de Resultados

Como se vio en la sección anterior, ambos algoritmos proveen la


solución óptima al problema de la Torre de Hanoi. La pregunta queda
en relación a su efectividad en términos de tiempo de computación.
Como se estableció anteriormente, los algoritmos recursivos son más simples
de programar (se pueden programar en menos líneas de código), pero toman
más tiempo en ejecutar por la necesidad de mantener valores intermedios para
resolver la recursión.

Los códigos presentados en la Figuras 6 y 7 ciertamente apoyan lo


reportado en la literatura acerca de la complejidad. El código recursivo
se completó en menos de la mitad del código requerido para el
algoritmo iterativo. Claro está, la autora no reclama ser una experta
en programación, por lo que no se concluye que los algoritmos
presentados son óptimos en términos de cantidad de líneas de código,
pero ciertamente este hallazgo va de acuerdo a lo reportado por otros
autores.

21
Para probar el reclamo del tiempo de ejecución, los algoritmos
anteriormente descritos fueron ejecutados varias veces para verificar
su desempeño y poder comparar sus resultados. Para cada caso
(cantidad de discos), los algoritmos se ejecutaron cinco (5) veces y se
tomó nota del tiempo de ejecución de cada corrida. La Tabla 2
presenta los resultados como el promedio del tiempo de ejecución.

Tabla 2: Resultados experimentales del tiempo de ejecución


(seg.)
Algoritmo
Cantidad de Algoritmo Algoritmo
iterativo
Discos iterativo recursivo
modificado*
3 0.0156 1.872056*10-17 0.47705*10-17
4 0.0314 3.23092*10-17 6.04262*10-17
5 0.0686 0.0053 0.0053
6 0.1498 0.0104 0.0107
7 0.3124 0.0156250 0.016
8 0.7062 0.0312500 0.0263
9 1.5590 0.0468750 0.047
10 3.6248 0.0781250 0.094
*Para el algoritmo iterativo modificado se suprimió la impresión de las
matrices intermedias y se cambió el comando Timing, por el comando
AbsoluteTiming para poder tener mayor precisión de los resultados.

Se entiende que, puesto que los resultados de ambos algoritmos


difieren en formato, el tiempo de ejecución va a ser diferente. Por
tanto, no sería justo el realizar comparaciones estadísticas respecto a
sus diferencias. No obstante, es posible hacer comparaciones entre los
algoritmos en relación a la diferencia relativa que tardan en trabajar
los problemas cuando aumenta la cantidad de discos. Esta
comparación se presenta en la Figura 9 donde los datos que forman las
curvas se obtuvieron con la siguiente ecuación.

Tiempo de computació n para N discos


N
Tiempo de computació n para 3 discos
3

22
Figura 9 Datos normalizados del tiempo de computación por disco añadido al juego

De la gráfica que aparece en la Figura 9 se observa que los tiempos de


ejecución de los algoritmos recursivo e iterativo difieren grandemente.
Nótese que aunque las curvas tienen formas similares, los ejes no
tienen la misma escala. Los tiempos para el algoritmo recursivo (línea
verde en el eje de la izquierda) están en el orden de 10 -15 mientras que
el iterativo (línea azul en el eje de la derecha) toma aproximadamente
70 veces más con diez discos que con 3 discos.

No obstante, al comparar contra los datos del algoritmo iterativo


modificado, en el que se eliminó la impresión de las matrices
intermedias para hacerlo más comparable al funcionamiento del
algoritmo recursivo, se observa que el incremento en tiempo con
aumento en discos es menor para el algoritmo iterativo que para el
recursivo. Esto sugiere que, en efecto, los algoritmos recursivos toman
más tiempo de computación que los algoritmos iterativos; lo cual
también apoya lo reportado en la literatura.

Conclusión

Por definición, los algoritmos son “conjuntos ordenados y finitos de


operaciones que permiten hallar la solución de un problema”. Estos se
pueden clasificar de muchas maneras en base a su estructura,
acercamiento al problema, construcción, etcétera.

23
En este trabajo se realizó una comparación entre algoritmos
recursivos e iterativos. Como se mencionó anteriormente tanto la
recursión como la iteración buscan que el algoritmo se ejecute en
forma secuencial y consecutiva un cierto número de veces. La
diferencia entre éstas estriba en que la iteración ejecuta el algoritmo
completamente antes de volverlo a llamar, mientras que la recursión
llama al mismo algoritmo para poder resolverlo.

De acuerdo a la literatura, los algoritmos recursivos son más simples


(requieren menos líneas de código) que los iterativos, pero toman más
tiempo de computación. Para verificar esto se construyeron algoritmos
recursivos e iterativos para proveer la solución óptima al clásico
problema de la Torre de Hanoi. Los algoritmos implementados fueron
de forma tal que permiten modificación en la cantidad de discos, pero
fija la cantidad de columnas a tres.

Los resultados obtenidos de los algoritmos van de acuerdo a lo


reportado en la literatura en el sentido de que el algoritmo recursivo
requiere menos líneas de código para la implementación, pero el
tiempo de ejecución aumenta, en proporción mayor que el iterativo, al
aumentar la cantidad de discos en el problema.

Referencias

• Algoritmia.org. 2010. http://www.algoritmia.org/

• Axelsson, O. 1994. Iterative Solution Methods. Cambridge


University Press.

• Beardon, A. F. 1991. Iteration of Rational Functions. Graduate


Texts in Mathemathics. Number 132. Springer-Verlag.

• Berend, D. y Sapir, A. 2006. The Diameter of Hanoi Graphs.


Information Processing Letters 98 (2006) 79-85.
http://graph.cs.ntust.edu.tw/meeting/%E8%8E%AB
%E5%92%B8%E5%8B%A4/The%20diameter%20of%20Hanoi
%20graphs.pdf

• Brassard, G. y Bratley, P. 1996. Fundamentals of Algorithmics.


Prentice-Hall, Inc.

• Chen, X. y Shen, J. 2004. On the Frame-Stewrd Conjeture about


the Towers of Hanoi. Society for Industrial and Applied
Mathematics. Vol. 33 (3) pp. 584-589. SIAM J. Comput.

24
• Crossley, J. N. 1967. Sets, Models and Recursion Theory.
Proceedings of the Summer School in Mathematical Logic and
Tenth Logic Colloquium. Leicester. August-September 1965.
North-Holland Publishing Company

• Dávila-Rascón, G. 2002. El Desarrollo del Algebra Moderna. Parte


I: El álgebra en la antigüedad. Apuntes de Historia de la
Matemáticas. Vol. 1, No. 3, Septiembre 2002

• Fenstad, J. E. 1980. General Recursion Theory: An axiomatic


approach. Springer-Verlag Berlin Heidelberg.

• Frame, J. S. 1941. Solution to advanced problem 3918, Amer.


Math. Monthly, 48 (1941), pp. 216–217.

• Goodstein, R. L. 1964. Recursive Number Theory. A development


of recursive arithmetic in a logic-free equation calculus. North
Holland Publishing Company

• Greenberg, N. 2006. The Role of True Finiteness in the


Admissible Recursively Enumerable Degrees. Memoirs of the
American Mathematical Society. Number 854. American
Mathematical Society.

• Hinman, P. G. 1978. Recursion-Theoretic Hierarchies. Springer-


Verlag Berlin Heildelberg.

• Hinz, A. M. y Parisse, D. 2002. On the Planarity of Hanoi Graphs.


Expositiones Mathematicae. 20(2002):263-268

• Houston, B y Masum, H. 2004. Explorations in 4-peg Tower of


Hanoi. Carleton University Technical Report TR-04-10.
http://www.exocortex.org/toh/

• Mascolo, V. 2007. Stacking puzzle and method for playing same.


US Patent 7566057.
http://www.patentstorm.us/patents/7566057/claims.html

• McCann, W. 2007. Tower of Hanoi & Reve Puzzles. Ney York


University. http://cs.nyu.edu/courses/summer07/G22.2340-
001/Presentations/McCann.pdf

• Nerode, A. y Shore, R. A. 1984. Proceedings of Symposia in Pure


Mathematics of the American Mathematical Society. Cornell

25
University, Ithaca, New York. American Mathematical Society.
Volume 42.

• Norris, A. C. 1981. Computational Chemistry: An introduction to


numerical methods. John Wiley & Sons.

• O’Connor, J. J. y Robertson, E. F. 1996. François Edouard Anatole


Lucas. http://www-gap.dcs.st-
and.ac.uk/~history/Biographies/Lucas.html

• Palais, R. S. y Palais, R. A. 2009. Differential Equations,


Mechanics, and Computation. Student Mathematical Library.
IAS/Park City Mathematical Subseries. Volume 51. American
Mathematical Society. Institute for Advance Study.

• Real Academia Española. 2001. Diccionario de la Lengua


Española. Vigésimo segunda edición. http://www.rae.es/rae.html

• Rosen, K. H. 2003. Discrete mathematics and its applications.


Quinta edición. McGraw-Hill Co.

• Shen, J. 2004. On the Frame-Stewart Conjecture about the Tower


of Hanoi. Texas State University.
http://frank.mtsu.edu/~sseo/shen.pdf

• Snapp, R. 2005. Tower of Hanoi. Lecture Notes for CS 5.


Delivered on November 14, 2005.
http://www.cs.uvm.edu/~snapp/teaching/cs32/lectures/hanoi.pdf

• Stewart, B. M. 1941. Solution to advanced problem 3918, Amer.


Math. Monthly, 48 (1941), pp. 217–219.

• Stockmeyer, P. K. Y Lunnon, F. 2008. New Variations on the


Tower of Hanoi. http://www.cs.wm.edu/~pkstoc/greece.pdf

• Valeiras, R. 2004. La Torre de Hanoi.


http://www.rodoval.com/heureka/hanoi/

• Weisstein, E. W. 2006 "Tower of Hanoi." From MathWorld--A


Wolfram Web Resource.
http://mathworld.wolfram.com/TowerofHanoi.html

• Wikipedia.org. 2010. http://es.wikipedia.org

26

Вам также может понравиться