Chamada recursiva de funções da linguagem c (problema da Torre de Hanói, problema de recursão de escada, etc.)

Chamada recursiva de funções da linguagem c (problema de Hanói, problema de escada recursiva, etc.)

Quando entrei pela primeira vez em contato com a linguagem C, senti que a chamada de função recursiva aqui era um tanto complicada e difícil de entender.Agora, para fins de revisão, vou esclarecer e apresentar alguns tópicos recursivos.

1. O que é uma chamada recursiva

A chamada recursiva de uma função refere-se a chamar direta ou indiretamente a própria função no processo de chamada de uma função.

2. Análise chave

O ponto chave é analisar a relação recursiva entre as primeiras n-1 vezes e o enésimo processo de um determinado problema a ser resolvido; além disso, a condição inicial da recursão não deve ser ignorada e deve ser escrita separadamente.

3. Exemplos

3.1 Encontre n recursivamente!

Análise: n! = N * (n-1) !; (n-1)! = (N-1) * (n-2)! …… Quando n = 1, n! = 1.
Código de função:
int jiecheng(int n)
{
	if(n==1)
		return 1;
	else
		return(n*jiecheng(n-1));
}

3.2 Problema da Torre de Hanói (Hanói)

Insira a descrição da imagem aqui

Análise: Entenda como mover o primeiro n-1 vezes e o último.Quando n = 1, este caso especial deve ser considerado separadamente.

Tomando n = 64 como exemplo, as etapas de resolução de problemas consideradas devem ser: suponha que haja um mestre que pode mover as primeiras 63 camadas de A para B (a ordem de grande primeiro, pequeno primeiro) e não importa como ele se move, o que precisamos fazer É mover a última camada de A para C e, em seguida, mover as 63 camadas de B para C, completando assim a última etapa.

Recursão direta: Este mestre move as primeiras 63 camadas de A para B e de B para C, o método acima também é usado, conforme mostrado na figura
Insira a descrição da imagem aqui
abaixo.Finalmente recursivo para n = 1.

Quando n = 1, apenas mude esta camada de A-> C.

Código de função:
void hanoi(int n, char A, char B, char C)  //实现n层塔从A借助B移动到C。
{
    void move(char a, char b);
    if(n==1)
        move(A, C);
    else
    {
        hanoi(n-1, A, C, B); //前n-1层从A借助C移动到B
        move(A, C);          //第n层从A移到C
        hanoi(n-1, B, A, C); //移动到B的n-1层借助A移动到C
    }
}
void move(char a, char b)    //定义打印函数
{
    printf("%c->%c\n",a,b);
}

Código completo:
#include<stdio.h>
#include<stdlib.h>
int main()
{
    void hanoi(int n, char A, char B, char C);
    char A='A', B='B', C='C';
    int n;
    scanf("%d",&n);
    printf("%d层汉诺塔移动步骤为:\n",n);
    hanoi(n, A, B, C);
    return 0;
}
void hanoi(int n, char A, char B, char C)  //实现n层塔从A借助B移动到C。
{
    void move(char a, char b);
    if(n==1)
        move(A, C);
    else
    {
        hanoi(n-1, A, C, B); //前n-1层从A借助C移动到B
        move(A, C);          //第n层从A移到C
        hanoi(n-1, B, A, C); //移动到B的n-1层借助A移动到C
    }
}
void move(char a, char b)    //定义打印函数
{
    printf("%c->%c\n",a,b);
}

Resultados da operação (n = 3 como exemplo, porque n = 64 etapas são muitos):

Insira a descrição da imagem aqui

3.3 Problema recursivo de subir escadas

As escadas têm n degraus. Você pode subir um degrau, dois degraus ou três degraus. Quantas maneiras diferentes existem de calcular?

Análise: o foco está na última etapa. Existem três maneiras de avançar na última etapa, a saber: etapa 1, etapa 2 e etapa 3. Assumindo que a última etapa está até o nível 1, continue a considerar as primeiras n-1 etapas (aplicar recursão) e, finalmente, todas as etapas são lad (n-1) + lad (n-2) + lad (n-3 )
Código de função:
int lad(int n)       //定义函数
{
	if(n==1)
		return 1;
	else if(n==2)
		return 2;
	else if(n==3)
		return 4;
	else
		return lad(n-1)+lad(n-2)+lad(n-3);  //
}
Código completo:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int lad(int n);
    int n;
    scanf("%d",&n);
    printf("%d",lad(n));
    return 0;
}
int lad(int n)
{
	if(n==1)
		return 1;
	else if(n==2)
		return 2;
	else if(n==3)
		return 4;
	else
		return lad(n-1)+lad(n-2)+lad(n-3);
}

resultado da operação:

Insira a descrição da imagem aqui

4. Resumo

A chave para a recursão é começar com a cauda, ​​encontrar a relação entre a última etapa e as n-1 etapas anteriores e listar as condições de valor iniciais.

Acho que você gosta

Origin blog.csdn.net/SingDanceRapBall/article/details/92800654
Recomendado
Clasificación