Da recursão à Torre de Hanói

A recursão, como todos sabem, o famoso número de Fibonacci é um exemplo clássico desse ponto de conhecimento.
Hoje, vamos dar uma olhada no problema recursivo mais clássico, Tower of Hanoi e Frog Jumping Steps , mas na verdade este é um problema matemático. Vamos dar uma olhada na Torre de Hanói primeiro.

Torre de Hanói

O matemático francês Edward Lucas escreveu certa vez uma antiga lenda indiana: No templo sagrado de Benares (no norte da Índia), no centro do mundo, três agulhas de gema são inseridas em uma placa de latão. Quando o principal deus do hinduísmo, Brahma, criou o mundo, ele usava em uma das agulhas 64 peças de ouro de grande a pequeno porte.Esta é a chamada Torre de Hanói. Não importa o dia ou a noite, sempre há um monge movendo essas peças de ouro de acordo com a seguinte regra: apenas uma peça de cada vez, não importa em qual agulha esteja, a peça pequena deve estar em cima da peça grande. Os monges previram que quando todas as peças de ouro fossem movidas da agulha usada por Brahma para outra agulha, o mundo seria varrido com um raio e o pagode, os templos e os seres sencientes morreriam.

Esta lenda é bastante interessante. Esta lenda diz que existem 64 moedas de ouro. Mas vamos discutir se existem apenas 3 ou 4 lantejoulas. Dê uma olhada no mapa da rede.
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Começamos a discussão com três peças. No início do tópico de discussão, entenda que a posição desta coluna não afeta o movimento, mas a coluna específica é a chave.
Vamos ver quantas vezes se mover se houver apenas uma lantejoula.

Insira a descrição da imagem aqui
Obviamente, apenas uma vez é suficiente.
Vamos dar uma olhada em duas peças de ouro.
Insira a descrição da imagem aqui

Insira a descrição da imagem aqui
Já que temos que mover tudo para o pilar C

1 :
a: A-> B
2:
b: A-> C
3;
a: B-> C

Você pode mover tudo em três etapas.
Ou, se quiser mover a fatia b, você precisa mover a fatia a primeiro, deixando o pilar C vazio para a fatia b para considerar o movimento da fatia a.
Vamos dar uma olhada no movimento das três peças.
Insira a descrição da imagem aqui
Então, de acordo com a ideia acima, se você quiser mover a peça C, você deve mover as peças aeb primeiro, deixando o pilar C para a peça c.
Essa condição deve ser atendida primeiro,
Insira a descrição da imagem aqui
e o grande não pode estar acima do pequeno. Deve ser movido assim primeiro.
Insira a descrição da imagem aqui
E, se quiser ficar satisfeito com essa aparência, primeiro.
Insira a descrição da imagem aqui
Em conclusão,

Primeiro passo

Insira a descrição da imagem aqui

Segundo passo

Insira a descrição da imagem aqui

terceiro passo

Insira a descrição da imagem aqui
Vendo desta forma, não é diferente da discussão anterior, que moveu apenas duas peças.
Em seguida, mova a fatia c para a coluna C.
Insira a descrição da imagem aqui
Ficou assim. Vamos dar uma olhada novamente.Como eu disse no início do artigo, a posição da coluna não é crítica.A posição pode ser alterada, mas deve ser movida para uma coluna específica. Agora parece que movemos as duas lantejoulas antes?
Insira a descrição da imagem aqui
Veja claramente, isso se parece com as etapas para mover duas lantejoulas. Em seguida, siga as etapas acima e isso funcionará.
Vamos calcular as etapas de escrita

A primeira parte:
mova duas lantejoulas para o pilar B.
A segunda parte:
mova a peça C para o pilar C. A
terceira parte:
mova as duas lantejoulas para o pilar C.

Para resumir
, as etapas para mover duas lantejoulas, mova duas vezes e depois mova a lantejoula de baixo novamente. Um total de 2 * 3 + 1 == 7 vezes.

Vejamos as etapas das quatro lantejoulas.

Se você quiser mover essas quatro lantejoulas, você deve mover a lantejoula inferior

Insira a descrição da imagem aqui
Olhando dessa forma, há duas partes.

Um:
Mova a peça d para a coluna C.
Dois:
Mova as três peças de ouro abc para a coluna C.

Analogia com mover três peças acima,

Primeiro propósito

Insira a descrição da imagem aqui

Segundo propósito

Insira a descrição da imagem aqui

Terceiro propósito

Insira a descrição da imagem aqui
Isso pode ser feito em três partes. Pode-se ver que o método de movimento de três peças precisa ser movido duas vezes.
Isso é 2 * 7 + 1 == 15 vezes.
**

E assim por diante

**
Ao mover N peças de lantejoulas, primeiro considere,
um -> mova as N-1 peças de lantejoulas.
Dois -> mova a enésima fatia novamente,
três -> mova a N-1 fatia para o destino novamente.
Pode ser dividido em três etapas.
A posição do pilar não tem efeito sobre o movimento.
Veja o código, este é o código para contar o número de vezes.

#include <stdio.h>
int hanoi(int n)
{
    
    
	if (n >= 2)
		return 2 * hanoi(n - 1) + 1;
	return 1;
}
int main(void)
{
    
    
	printf("Problem of Hanoi\n");
	printf("please input the number for problem:>\n");
	int n;
	scanf("%d", &n);
	printf("%d",hanoi(n));
	return 0;
}

Este é o código para a etapa de compilação

#include <stdio.h>
void move(char start,char end,int n)
{
    
    
	static int count = 0;
	count++;
	printf("NO.%d step,the %d moves from %c to %c\n", count, n, start, end);
}
void hanoi(int n,char pose1,char pose2,char pose3)
{
    
    
	if (n == 1)
		move(pose1, pose3, 1);//一个是特例,不存在中间位置
	else
	{
    
    
		hanoi(n - 1, pose1, pose3, pose2);//对应第一次移动N-1个金片
		move(pose1, pose3, n);//对应移动第N个金片
		hanoi(n - 1, pose2, pose1, pose3);//最后一次移动N-1个金片
	}
}
int main(void)
{
    
    
	
	char pose1 = 'A';//起始位置
	char pose2 = 'B';//中间位置
	char pose3 = 'C';//结束位置
	int n;
	scanf("%d", &n);
	hanoi(n, pose1, pose2, pose3);
	
	return 0;
}

Ao usar a recursão, entenda-a como um módulo funcional , em vez de analisá-la passo a passo. Use sua função para determinar a condição de término e abordar essa condição ao mesmo tempo.
Usando funções de escrita recursiva, os cálculos podem ser "fáceis".
Apenas para aprofundar seu próprio entendimento, seja como um aluno, não ria.
Se você tiver alguma dúvida, dê-me alguns conselhos.

Acho que você gosta

Origin blog.csdn.net/weixin_52199109/article/details/113003580
Recomendado
Clasificación