当前位置:网站首页>C | récursion de la fonction

C | récursion de la fonction

2021-10-14 06:30:00 Ersansui

Préface

Les problèmes de la vie sont complexes et changeants,Certaines questions semblent complexes、Fastidieux、Il n'y a aucun moyen de le faire,Mais une analyse attentive,Il y a aussi des problèmes qui peuvent se décomposer en quelques petits problèmes,Et chaque petit problème a des similitudes,À ce stade, nous pouvons penser à la possibilité de résoudre le problème avec la récursion de la fonction.

Un.、 Récursion de la fonction

Qu'est - ce que la récursion fonctionnelle(recursion)?

La récursion fonctionnelle est une fonction qui appelle directement ou simplement son propre processus.

Insérer la description de l'image ici

2.、 Condition de récurrence de la fonction

Comme le montre la figure 1 ci - dessus,Si la fonction fait un appel récursif directement,Le processus d'appel se poursuivra,Faire en sorte que le programme ne s'arrête pas,C'est clairement interdit,Alors...,La récursion de la fonction doit être limitée.

1.Il y a un ou plusieurs états de terminaison, Et il y a des restrictions , Lorsque les conditions sont remplies pour l'état de résiliation , La récursion doit être arrêtée .

2. Les contraintes doivent se rapprocher de l'état de fin après chaque appel récursif .

Quatre mots en résumé :Les choses tournent mal.

Si l'une des conditions ci - dessus n'est pas remplie , Et utiliser la récursion , Il y aura récursion de la mort .Abréviations:“ Tortue morte ”C'est bon.!
Insérer la description de l'image ici

Trois、Analyse du processus récursif de la fonction

Nous calculons un entier positif donné par récurrence de la fonction n Pour analyser la factorielle de .

Supplément: La factorielle est dérivée de 1 J'ai été fatigué de multiplier nEn soi

C'est - à - dire::1 * 2 * 3 * ……* n

Nous analysons à travers le Code et le dessin

#include<stdio.h>
// Définir une fonction pour la récursion 
int f(int n)
{
    
	if (1 == n)
		return 1;
	else
		return n * f(n - 1);
}

int main()
{
    
	int n = 0;
	int sum = 1;
	scanf("%d", &n);
	printf("%d", f(n));//À saisirnFonctions entrantes, Et imprimez la valeur de retour de la fonction 
	return 0;
}

Insérer la description de l'image ici

En bas, Nous combinons ensuite le cadre de la pile de fonctions pour analyser

En cours d'exécution, La mémoire crée un espace mémoire pour le programme , Et nous pouvons approximativement diviser l'espace du programme en trois zones :Zone de gerbage、Stack area、Zone statique.

En général, La zone heap est utilisée pour l'allocation dynamique de mémoire , La zone de pile est utilisée pour créer des variables locales et des paramètres de fonction , La zone statique est utilisée pour stocker les variables globales et statiques .

Notre fonction pendant l'appel , Ouvre un espace dans la pile qui appartient à la fonction , Et cela inclut mainFonctions、 Fonctions de bibliothèque et fonctions personnalisées .

Insérer la description de l'image ici

Comme le montre la figure ci - dessus,, La fonction est appelée en permanence , Ça consomme de l'espace dans la pile , Et ce processus est appelé “Pile de pression

Chaque fois qu'une fonction est appelée , Assurez - vous d'attendre que la fonction appelée par la fonction courante retourne et détruise l'espace de pile , Quand la fonction secondaire continue

Et seulement si la condition n'est pas remplie pour appeler la fonction , La fonction ne revient pas à pas , L'espace consommé sera détruit étape par étape , Et le rendre au système d'exploitation . Si dans le processus récursif , L'utilisation de l'espace de pile a dépassé la plage maximale , Il y aura un crash de programme .

Si le nombre de récursions est trop élevé , Cela ralentira l'efficacité du programme , Il peut même causer une exception de programme en appuyant sur la pile .

Alors..., Bien que la récursion soit parfois pratique pour résoudre les problèmes , Mais dès qu'on i Apprenez à contrôler le nombre et les conditions de récursion .

Quatre、Exemple de fonction récursive

Imprimez chaque bit d'un entier de façon récursive

#include<stdio.h>

void f(int n)
{
    
	if (n > 9)
	{
    
		f(n / 10);//Sin Il y a deux chiffres et plus ,Appeléf(n/10), Imprimez le dernier chiffre .
	}
	printf("%d", n % 10);
}

int main()
{
    
	int n = 0;
	scanf("%d", &n);
	f(n);
	return 0;
}

Ici, Le contenu récursif de la fonction est terminé , J'espère pouvoir aider mes camarades de classe .


Conclusion

La création n'est pas facile,J'espère que tout le monde peut faire quelque chose de bien、Commentaires、Avant、Attention à un dragon!

Votre soutien est ma plus grande motivation pour créer!!

En raison de mes capacités limitées,En cas d'erreur, J'espère que la correction !!

S'il y a une meilleure façon ou une meilleure idée , Les commentaires sont les bienvenus ~

Insérer la description de l'image ici

版权声明
本文为[Ersansui]所创,转载请带上原文链接,感谢
https://chowdera.com/2021/10/20211013211538545a.html

随机推荐