Anda di halaman 1dari 5

Universidad Central del Ecuador

Facultad de Ingeniería, Ciencias Físicas y Matemática


Ingeniería en Ciencias de la Computación

Integrantes: Montero Anthonny, Gallardo Kerly, Yánez Jessica, Cedeño


Cristhian, Suñiga Leonardo, Gallardo Kerly, Asimbaya Ismael, Damián Perrazo.

INTRODUCCIÓN

El juego de mesa “Las Torres de Hanoi” fue inventado en el año 1883 por el
matemático francés Édouard Lucas. El juego consiste en un número
cualquiera de discos perforados que deben ser transferidos desde la columna
inicial hacia una tercera columna teniendo en cuenta las siguientes
condiciones:
1. Solo se puede mover un disco a la vez.
2. No se puede poner un disco sobre otro de menor diámetro.
Para poder conocer el número mínimo de pasos (Movimientos) a realizar para
resolver este ​Puzzle se utiliza la fórmula 2n − 1 , donde n es el número total de
discos.
- Se ve utilidad en este ejercicio para aplicar los conceptos de iteración y
recursividad, por lo cual se procede a resolver este problema con el uso
del lenguaje de programación ​Python​ a través de ambos métodos.

Solución por Métodos Iterativos

Figura 1: Pedido de datos por teclado y asignación a una variable


Mostramos en pantalla “Ingrese el número total de discos”. El texto ingresado
por el usuario se lo asigna a la variable num ​a través de la función ​input()​, ya
que el texto recibido es de tipo String es necesario convertirlo a un entero a
través de la función ​int() ​para posteriormente asignar este valor a la variable ​n.
Figura 2: Puesta en marcha del algoritmo iterativo de Torres de Hanoi
NOTA: ​El operador << desplaza el número hacia la izquierda, llenando los
espacios vacíos con ceros, devolviendo un número binario que es traducido por
Python previo a realizar la comparación.
Se inicializa la variable ​x como 1, para posteriormente declarar un bucle while,
el cual se repetirá mientras x sea menor a el número 1 desplazado n posiciones
hacia la izquierda, donde n es el número total de discos. Posterior a ello se
imprime por pantalla “paso” x (correspondiente a la variable inicializada
previamente y que se pondrá como contador), “mover de torre”
(x&x-1) el cual determina si los valores de x y x-1 son iguales, para arrojar el
valor de 0 o 1 y posteriormente dividirlo entre 3 (​%​3) y arrojar el residuo de esta
operación.
El código ​((x|x-1) +1) realiza una operación semejante para determinar si al
comparar bit a bit ambos datos son diferentes; al resultado del cual se le suma
uno, para posteriormente dividirlo para 3 (​%​3) y utilizar el residuo como
resultado.
Ambas operaciones nos ayudan a asegurar que el movimiento de la pieza más
pequeña se de cada (2n-1) paso, siendo el residuo de cada operación la
columna correspondiente al movimiento de las torres, ya que los valores
arrojados varían entre 0,1,2.
Se establece el aumento del contador asignando ​x+=1​;

Figura 3: Impresión del número de pasos


Imprime por pantalla “Número de pasos”, el número de 1 desplazado n veces
hacia la izquierda y restado uno.
Algoritmo recursivo
Para la implementación de este algoritmo se creó una función llamada
TorredeHanoi ​el cual recibe cuatro parámetros:
(n,torre_uno,torre_dos,torre_tres)​; donde ​n ​representa el número de discos,
torre_uno r​ epresenta la torre de origen, ​torre_dos r​ epresenta la torre auxiliar y
torre_tres ​ representa la torre de destino

Figura 4: Implementación de la función "TorredeHanoi" para el método


recursivo.
El caso base del método recursivo es para n=1, en el cual se moverá el (único)
disco en la torre de origen a la torre de destino y se terminará la iteración.
Para otros casos, se llama internamente a la función con n=n-1 y los
parámetros: torre de origen, torre de destino y torre auxiliar, de la siguiente
manera: ​TorredeHanoi(n-1,torre_uno,torre_tres,torre_dos)
​ iscos de la torre de origen (​torre_uno​) a la torre_2
Con esto se pasarán los ​n-1 d
usando como torre auxiliar la ​torre_tres (​ ver figura 5)

Figura 5: Pasar los (n-1) discos a la torre_dos usando como auxiliar la


torre_tres. (​imagen referencial, tomada de un simulador usando tres discos​)
En la línea 15 del código (ver figura 4) se mueve el ultimo disco que queda en
la torre de origen (torre_uno) a la torre de destino (torre_tres), quedando el
sistema así:

Figura 6: Pasar el disco n de la torre de origen a la torre de destino (i​ magen


referencial, tomada de un simulador usando tres discos)​

Finalmente, en la línea 16 del código


(TorredeHanoi(n-1,torre_dos,torre_uno,torre_tres​))​ ​se llama otra vez a la
funcion para pasar los ​n-1 discos de la torre de origen(torre_2) a la torre de
destino (torre_tres) usando como torre auxiliar la ​torre_uno.

Figura 7: los n discos en la torre de destino (i​ magen referencial, tomada de un simulador
usando tres discos)​

Aquí un ejemplo de la salida del programa, con tres discos y llamando a la


función como: ​TorredeHanoi(n​,​"A"​,​"B"​,​"C"​)
donde A es la torre de origen inicial
B: es la torre auxiliar inicial,
C: es la torre de destino.
Figura 8: Resultado en consola para el algoritmo recursivo cuando n=3

Ventajas y Desventajas de la recursividad e


interatividad
Lo adecuado es saber las ventajas y desventajas de cada uno y aplicar la
mejor alternativa.

El código con recursividad es más consistente que el código con iteración. Solo
hay una sentencia en el método de recursividad, y existe más de una sentencia
en el método con iteraciones. Adicionalmente, los bucles, que incluyen varios
bucles son complejos de leer y entender. La recursividad es más clara y simple
para dividir problemas complejos en piezas manejables.

Pero, el uso de la recursividad presenta ciertas desventajas. Debido a que en la


recursividad una función se llama a sí misma, involucra tiempo y espacio: debe
utilizar mucha memoria de la pila de datos para trabajar los resultados. Por lo
tanto, la solución recursiva para calcular 1+2+..+n no es tan eficiente como la
solución iterativa.

Suele haber estas diferencias básicas:

La forma recursiva, es mucho más lenta que la forma iterativa, especialmente


para números "grandes"

La forma recursiva suele ser más sencilla de realizar que la iterativa. Aunque
esto depende de la sucesión/algoritmo que busquemos.

​Conclusiones

Los algoritmos iterativos tienden a ser más eficientes que los algoritmos
recursivos ya que poseen un orden que los hace más eficientes.Además, se
evidencia por medio del análisis de tiempos de ejecución donde claramente los
algoritmos iterativos se realizan en menor tiempo que los recursivos siendo así
estos más eficientes.

Anda mungkin juga menyukai