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)
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.
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):
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:
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.