Cours 11 fonctions récursives, pile d’appel

sans copyright
, par
Le support du cours
Le programme montré en exemple
- /* Declaration de fonctionnalites supplementaires */
- #include <stdlib.h> /* EXIT_SUCCESS */
- #include <stdio.h> /* printf() */
- /* Declarations constantes et types utilisateurs */
- /* Declarations de fonctions utilisateurs */
- int factorielle(int n);
- int binomial(int n, int p);
- double faire_moyenne();
- double faire_moyenne_aux(double somme, int n);
- int sanscasbase(int n);
- int McCarthy(int x);
- /* Fonction principale */
- int main()
- {
- /* Declaration et initialisation des variables */
- int x = 3; /* argument */
- int res; /* resultat */
- /* Pour créer un dépassement de pile
- sanscasbase(1);
- */
- /* 91 */
- x = 23;
- res = McCarthy(x);
- /* factorielle */
- res = factorielle(x);
- /* coefficient binomial */
- /* moyenne */
- /* plus joli et plus sur */
- /* Valeur fonction */
- return EXIT_SUCCESS;
- }
- /* Definitions de fonctions utilisateurs */
- int factorielle(int n)
- {
- int res; /* resultat */
- if (n > 1) /* cas récursif */
- {
- res = n * factorielle(n - 1);
- }
- else /* cas de base */
- {
- res = 1;
- }
- return res;
- }
- int binomial(int n, int p)
- {
- if ( (p == 0) || (n == p) ) /* cas de base */
- {
- return 1;
- }
- return binomial(n - 1, p - 1) + binomial (n - 1, p);
- }
- double faire_moyenne()
- {
- return faire_moyenne_aux(0, 0);
- }
- double faire_moyenne_aux(double somme, int n)
- {
- int terme = -1;
- if (terme < 0) /* case de base */
- {
- return somme / n; /* moyenne des termes precedents */
- }
- return faire_moyenne_aux(somme + terme, n + 1);
- }
- int sanscasbase(int n)
- {
- /* Pour prendre plus de place sur la pile :
- int tab[1024] = {1};
- */
- return sanscasbase(n - 1);
- }
- int McCarthy(int x)
- {
- if (x > 100)
- {
- return (x-10);
- }
- else
- {
- return McCarthy(McCarthy(x + 11));
- }
- }