Trate de entender el algoritmo recursivo a través de la Torre de Hanoi (Torre de Hanoi)-Python

Prólogo: nunca antes había podido entender este problema, pero hoy de repente me di cuenta y lo descubrí, así que hice un registro.

Si hay un malentendido, corríjame en el área de comentarios.

Descripción del problema

Hay tres pilares adyacentes, etiquetados A, B y C. En el pilar A, hay n discos de diferentes tamaños apilados en forma de pirámide de abajo hacia arriba. Mueva todos los discos al pilar B uno por uno, y cada uno La placa no puede aparecer encima de la placa pequeña en el mismo pilar cada vez que se mueve ¿Cómo se debe mover?
inserte la descripción de la imagen aquí

código:

def Move(n,start,middle,target):
    if n==1:
        print(start,'->',target)
        return 
    Move(n-1,start,target,middle)
    print(start,'->',target)
    Move(n-1,middle,start,target)
Move(3,A,B,C)

tren de pensamiento

La idea de este tema es el algoritmo recursivo.
El núcleo de la recursividad radica en una especie de pensamiento de la recursividad. No siempre intente profundizar en la recursividad para pensar en cómo cambiar recursivamente las variables capa por capa . Su pequeño cerebro es no tan grande Área de pila! ! !

1. Primero dé algunas definiciones:
definimos la cantidad de discos que deben transferirse como -n , todos
los discos en nuestra etapa actual se colocan en una columna, llamamos a esta columna - inicio , por lo que el tiempo de inicio A = inicio ;
nuestro propósito es transferirlos todos a otra columna, llamamos a esta columna - target , por lo que el tiempo de inicio C=target ;
al mismo tiempo, todavía hay una columna sin definir, también podríamos llamarla - middle , entonces el momento inicial B=medio ;

2. Queremos mover n discos desde el inicio = A hasta su destino = C, primero debemos mover n-1 discos desde el inicio = A hasta el medio = B, luego, para el idioma de n-1 discos, su destino = B;
inserte la descripción de la imagen aquí

Entonces, ¿cómo podemos mover n-1 discos de todos a B, es decir, primero mover n-2 discos desde el inicio = A hasta el destino = C?
Por analogía, hasta n=1, esta vez mueva directamente este disco desde su inicio hasta el objetivo.
En resumen,
al mover n discos, tiene inicio, medio y destino;
en este momento, es necesario mover n-1 discos primero, su inicio sigue siendo el inicio y su destino es el último medio.
En código corresponde a:

def Move(n,start,middle,target):
    if n==1:
        print(start,'->',target)
        return 
    Move(n-1,start,target,middle) 

Ahora hemos movido n-1 discos de todos a B, es decir, toda la recursividad ha terminado y estamos de vuelta en la capa actual, ¿recuerdas la capa actual? La capa actual inicio=A, destino=C. Todo lo que tenemos que hacer a continuación es mover 1 disco de A a C.
inserte la descripción de la imagen aquí

El código correspondiente es una línea más:

def Move(n,start,middle,target):
    if n==1:
        print(start,'->',target)
        return 
    Move(n-1,start,target,middle)
    print(start,'->',target)

Este tiempo aún no ha terminado. En la capa n = n, nuestros discos n-1 están todos en el medio = B. Debemos moverlos desde el medio = B hasta el objetivo = C. ¿Cómo moverlos? Con la ayuda de A, En otras palabras, para la capa n=n-1, ahora el comienzo es el medio en la capa n=n, el medio es el comienzo en la capa n=n y el objetivo es el objetivo en la capa n=n .
En términos de código:

def Move(n,start,middle,target):
    if n==1:
        print(start,'->',target)
        return 
    Move(n-1,start,target,middle)
    print(start,'->',target)
    Move(n-1,middle,start,target)

Finalmente, haré un pequeño resumen, en resumen, cada capa de recursión debe usar la mitad de la capa de recursión anterior como el objetivo de esta capa, y luego mover el inicio al objetivo
cuando finaliza la recursión y vuelve a la actual. capa.
Después de que finaliza el movimiento, debido a que n-1 discos se colocan en el medio, entonces, en este momento, el medio debe usarse como punto de partida para mover estos discos al objetivo.

Supongo que te gusta

Origin blog.csdn.net/qq_49030008/article/details/124898077
Recomendado
Clasificación