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.
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.
Obviamente, apenas uma vez é suficiente.
Vamos dar uma olhada em duas peças de ouro.
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.
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,
e o grande não pode estar acima do pequeno. Deve ser movido assim primeiro.
E, se quiser ficar satisfeito com essa aparência, primeiro.
Em conclusão,
Primeiro passo
Segundo passo
terceiro passo
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.
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?
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
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
Segundo propósito
Terceiro propósito
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.