Óliver, parte de este equipo de trabajo, nos hizo el favor de crear este enunciado ya que conoce perfectamente dicho tema.
Solución:
En realidad, la sección de donde tomaste ese código también ofrece una explicación:
Para mover n discos de la clavija A a la clavija C:
- mover n−1 discos de A a B. Esto deja el disco #n solo en la clavija A
- mueve el disco #n de A a C
- mover n−1 discos de B a C para que se asienten en el disco #n
Está bastante claro que primero tienes que eliminar norte − 1 disco para acceder a la norteel uno Y que primero tienes que moverlos a otra clavija que no sea donde quieres que aparezca la torre completa.
El código en su publicación tiene tres argumentos, además de la cantidad de discos: A fuente clavija, un destino clavija y un temporal clavija en la que los discos se pueden almacenar en el medio (donde cada disco con tamaño norte − 1 encaja).
La recursión ocurre en realidad dos veces, allí, una vez antes de la writeln
, una vez después. El anterior al writeln
Se moverá norte − 1 discos en la clavija temporal, usando la clavija de destino como almacenamiento temporal (los argumentos en la llamada recursiva están en diferente orden). Después de eso, el disco restante se moverá a la clavija de destino y luego la segunda recursión obliga a mover toda la torre, moviendo el norte − 1 torre desde la clavija temporal hasta la clavija de destino, encima del disco norte.
Hace un año tuve un curso de programación funcional y dibujé esta ilustración para el algoritmo. ¡Espero eso ayude!
(0) _|_ | |
__|__ | |
___|___ | |
____|____ ____|____ ____|____
(1.1) | | |
__|__ | |
___|___ _|_ |
____|____ ____|____ ____|____ (A -> B)
(1.2) | | |
| | |
___|___ _|_ __|__
____|____ ____|____ ____|____ (A -> C)
(1.3) | | |
| | _|_
___|___ | __|__
____|____ ____|____ ____|____ (B -> C)
(2.1) | | |
| | _|_
| ___|___ __|__
____|____ ____|____ ____|____ (A -> B)
(3.1) | | |
| | |
_|_ ___|___ __|__
____|____ ____|____ ____|____ (C -> A)
(3.2) | | |
| __|__ |
_|_ ___|___ |
____|____ ____|____ ____|____ (C -> B)
(3.3) | _|_ |
| __|__ |
| ___|___ |
____|____ ____|____ ____|____ (A -> B)
El problema de los 3 anillos se ha dividido en 2 problemas de 2 anillos (1.x y 3.x)
Hay una buena explicación de la implementación recursiva de Hanoi en http://www.cs.cmu.edu/~cburch/survey/recurse/hanoiimpl.html.
El resumen es, si desea mover la placa inferior del palo A al palo B, primero debe mover todas las placas más pequeñas encima de A a C. La segunda llamada recursiva es luego mover las placas que movió a C de vuelta a B después de que su caja base movió la única placa grande de A a B.
Reseñas y puntuaciones
Recuerda algo, que tienes la capacidad de añadir una evaluación justa si diste con el arreglo.