[Linguagem C] Explicação detalhada do problema da Torre de Hanói (função recursiva da linguagem C)

Introdução e histórico do problema

Torre de Hanói, também conhecida como Torre de Hanói. É um brinquedo educativo originário de antigas lendas indianas. Quando Brahma criou o mundo, ele fez três pilares de diamante. Em um pilar, havia 64 discos de ouro empilhados em ordem de tamanho. Brahma ordenou que Brahmin reorganizasse os discos em outro pilar em ordem de tamanho, de baixo para cima. Também está estipulado que o disco não pode ser ampliado no disco pequeno, e apenas um disco pode ser movido entre os três pilares por vez.
A seguir, analisaremos as ideias específicas do problema da Torre de Hanói!

Ilustração da Torre de Hanói em movimento

n=3

Insira a descrição da imagem aqui

Pode-se entender aqui que primeiro colocamos o anteriorn-1Os dois discos são movidos para o pilar B com a ajuda do pilar C, depois o disco maior é movido para o pilar C e então a mesma ideia é executada.

n=4

Insira a descrição da imagem aqui
quandon=4, ainda podemos primeiro colocar o anteriorn-1um disco (aqui, ou seja,três primeiros discos) tente colocá-lo no pilar B (a operação específica será explicada mais tarde) e, em seguida, coloque o disco maior no pilar C. Depois de fazer isso,Trate o disco maior como fixoe recebi a soman=3Uma situação semelhante é mostrada na figura acima. As transferências subsequentes são fáceisn=3mesmo.

Análise de problemas e implementação de código

Primeiro método de movimentação de disco n-1

Premissa: Existem n discos dispostos no pilar A, do menor para o maior. Existem três pilares. Marcamos esses três pilares como A, B e C, respectivamente.
1.Quando n for um número par, mova o menor disco na ordem A->B->C->A, mova uma vez;Quando n for um número ímpar, mova o menor disco na ordem A->C->B->A, mova uma vez;
2. Em seguida, mova os discos móveis dos outros dois pilares para o novo pilar.Ou seja, mova o disco do pilar não vazio para o pilar vazio. Quando ambos os pilares não estiverem vazios, mova o disco menor., mova uma vez. Embora esta etapa não especifique claramente qual disco mover, a ação executada é única.
3. Repita as operações 1 e 2 e finalmente complete o movimento da Torre de Hanói.

Número de movimentos

Ordem Número de movimentos lei
1 1 2^1-1
2 3 2^2–1
3 7 2^3-1
4 15 2^4-1
n \ 2^n-1

Se nos mudarmos antesn-1De acordo com a Hanoi(n-1)conclusão acima, o número de movimentos de n discos pode ser Hanoi(n)=2*Hanoi(n-1)-1calculado usando (n>0).

Código fonte

int Hanoi(int n)
{
    
    
	if (n > 0)
		return 2 * Hanoi(n - 1);
	else
		return 1;
}
int main()
{
    
    
	int n = 0;
	printf("圆盘的个数:>");
	scanf("%d", &n);
	int ret = Hanoi(n) - 1;
	printf("%d\n", ret);
	return 0;
}

Insira a descrição da imagem aqui

Impressão em etapas móveis

Para imprimir as etapas móveis no código, devemos entender todo o processo. Na verdade, há um loop no movimento da Torre de Hanói:Quando n é um número par, ele sempre faz um loop com A->B, A->C, B->C, A->B, C->A, C->B; quando n é um número ímpar, ele sempre loops com A ->C,A->B,C->B,A->C,B->A,B->C loop.
A implementação específica do código é a seguinte

#include<stdio.h>
#include<windows.h>
int count;
void Move(int n, char a, char b)
{
    
    
    count++;
    Sleep(1000);
    printf("第%2d次移动 Move %d: %c -> %c \n", count, n, a, b);
}
void Hanoi(int n, char a, char b, char c)
{
    
    
    if (n == 1)
    {
    
    
        Move(n, a, c);
    }
    else
    {
    
    
        Hanoi(n - 1, a, c, b);
        Move(n, a, c);
        Hanoi(n - 1, b, a, c);
    }
}

int main()
{
    
    
    int n = 0;
    printf("汉诺塔的层数:>");
    scanf(" %d", &n);
    Hanoi(n, 'A', 'B', 'C');
    return 0;
}

Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/2301_77404033/article/details/132132051
Recomendado
Clasificación