Appel récursif des fonctions du langage C (problème de la tour de Hanoi, problème de récursivité des escaliers, etc.)

Appel récursif des fonctions du langage C (problème de Hanoi, problème récursif d'escalier, etc.)

Quand je suis entré en contact pour la première fois avec le langage C, j'ai senti que l'appel récursif de la fonction était ici assez compliqué et difficile à comprendre.Maintenant, aux fins de révision, je vais redresser et introduire quelques sujets récursifs.

1. Qu'est-ce qu'un appel récursif

L'appel récursif d'une fonction fait référence à l'appel direct ou indirect de la fonction elle-même dans le processus d'appel d'une fonction.

2. Analyse clé

Le point clé est d'analyser la relation récursive entre les n-1 premières fois et le nième processus d'un certain problème à résoudre; de ​​plus, la condition de départ de la récursivité ne doit pas être ignorée, et doit être écrite séparément.

3. Exemples

3.1 Trouver récursivement n!

Analyse: n! = N * (n-1) !; (n-1)! = (N-1) * (n-2)! …… Quand n = 1, n! = 1.
Code de fonction:
int jiecheng(int n)
{
	if(n==1)
		return 1;
	else
		return(n*jiecheng(n-1));
}

3.2 Problème de la tour de Hanoi (Hanoi)

Insérez la description de l'image ici

Analyse: comprendre comment déplacer les n-1 premières fois et la dernière. Lorsque n = 1, ce cas particulier doit être considéré séparément.

En prenant n = 64 comme exemple, les étapes de résolution de problèmes envisagées devraient être: supposons qu'il y ait un maître qui puisse déplacer les 63 premières couches de A vers B (l'ordre du grand d'abord, petit d'abord) et peu importe comment il se déplace, ce que nous devons faire C'est de déplacer la dernière couche de A vers C, puis de déplacer les 63 couches de B vers C, complétant ainsi la dernière étape.

Récursivité avant: Ce maître déplace les 63 premières couches de A à B, et de B à C, la méthode ci-dessus est également utilisée, comme le montre la figure ci-dessous.
Insérez la description de l'image ici
Enfin récursive à n = 1.

Lorsque n = 1, changez simplement ce calque de A-> C.

Code de fonction:
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);
}

Code complet:
#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);
}

Résultats de l'opération (n = 3 à titre d'exemple, car n = 64 étapes sont trop nombreuses):

Insérez la description de l'image ici

3.3 Problème récursif de monter les escaliers

Les escaliers comportent n marches. Vous pouvez monter une marche, deux marches ou trois marches. Combien y a-t-il de façons différentes de calculer?

Analyse: L'accent est mis sur la dernière étape. Il existe trois façons de passer à la dernière étape, à savoir: l'étape 1, l'étape 2 et l'étape 3. En supposant que la dernière étape est au niveau 1, continuez à considérer les n-1 premières étapes (appliquez la récursivité), et finalement toutes les étapes sont lad (n-1) + lad (n-2) + lad (n-3 ).
Code de fonction:
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);  //
}
Code complet:
#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);
}

résultat de l'opération:

Insérez la description de l'image ici

4. Résumé

La clé de la récursivité est de commencer par la queue, de trouver la relation entre la dernière étape et les n-1 étapes précédentes et de lister les conditions de valeur initiale.

Je suppose que tu aimes

Origine blog.csdn.net/SingDanceRapBall/article/details/92800654
conseillé
Classement