Tente entender o algoritmo recursivo através da Torre de Hanoi (Hanoi Tower)-Python

Prefácio: Nunca consegui entender esse problema antes, mas hoje de repente percebi e descobri, então fiz um registro.

Se houver um mal-entendido, por favor, corrija-me na área de comentários.

Descrição do Problema

Existem três pilares adjacentes, rotulados como A, B e C. No pilar A, existem n discos de tamanhos diferentes empilhados em forma de pirâmide de baixo para cima. Mova todos os discos para o pilar B, um por um, e cada um a placa não pode aparecer acima da pequena placa no mesmo pilar toda vez que é movida. Como deve ser movida?
insira a descrição da imagem aqui

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)

linha de raciocínio

A ideia deste tópico é o algoritmo recursivo.
O núcleo da recursão está em um tipo de pensamento de recursão. Nem sempre tente aprofundar a recursão para pensar em como alterar variáveis ​​recursivamente camada por camada . Seu pequeno cérebro é não tão grande. Área de empilhamento! ! !

1. Primeiro, dê algumas definições:
definimos o número de discos que precisam ser transferidos como - n ;
todos os discos em nosso estágio atual são colocados em uma coluna, chamamos essa coluna de - start , então o tempo inicial A = start ;
nosso objetivo é transferir todos eles para outra coluna, chamamos essa coluna de - target , então o horário inicial C=target ;
ao mesmo tempo, ainda há a coluna indefinida, podemos também chamá-la de - middle , então o momento inicial B=meio ;

2. Queremos mover n discos de start=A para seu target=C, primeiro devemos mover n-1 discos de start=A para middle=B, então para n-1 discos language, seu target=B;
insira a descrição da imagem aqui

Então, como podemos mover n-1 discos de todos para B, ou seja, primeiro mover n-2 discos de start=A para target=C.
Por analogia, até n=1, desta vez mova diretamente este disco desde o início até o alvo.
Resumindo,
ao mover n discos, ele tem início, meio e destino;
neste momento, é necessário mover n-1 discos primeiro, seu início ainda é início e seu destino é o último meio.
Em código corresponde a:

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

Agora movemos n-1 discos de todos para B, ou seja, toda a recursão acabou e voltamos para a camada atual, lembra da camada atual? A camada atual start=A, target=C. Tudo o que precisamos fazer a seguir é mover 1 disco de A para C.
insira a descrição da imagem aqui

O código correspondente é mais uma linha:

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

Este tempo ainda não acabou. Na camada n=n, nossos n-1 discos estão todos no meio=B. Devemos movê-los do meio=B para o alvo=C. Como movê-los? Com ​​a ajuda de A , Em outras palavras, para a camada n=n-1, agora o início é o meio na camada n=n, o meio é o início na camada n=n e o alvo é o alvo na camada n=n .
Em termos 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)

Por fim, farei um pequeno resumo. Resumindo, cada camada de recursão deve usar o meio da camada anterior de recursão como destino desta camada e, em seguida, mover o início para o destino
quando a recursão terminar e retornar ao atual camada.
Após o término do movimento, como os n-1 discos são colocados no meio, é necessário usar o meio como ponto de partida e mover esses discos para o alvo.

Acho que você gosta

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