Asd2 PDF
Asd2 PDF
Asd2 PDF
7. La récursivité
En programmation, nombreux sont les problèmes qu’on résout en répétant plusieurs fois des
séquences d’instructions.
Certains langages sont munis de structures de contrôles répétitivesfs. C’est le cas notamment
pour la langage C, qui dispose des boucles pour (for) et tant que (while).
7.1.Définition
Une fonction récursive est une fonction qui s'appelle elle-même. Chaque appel à la fonction
est indépendant des autres, avec ses propres variables.
L'exemple le plus classique d'emploi de la récursivité est l'écriture de la fonction factorielle.
Pour rappel, la factorielle d'un nombre n est définie comme n fois la factorielle du nombre n-
1, et la factorielle de 1 est 1.
9
ASD2 CHAPITRE 1 : Les sous-programmes : Fonctions et Procédures 1MI
Exemple
N.B :
• L'écriture itérative de la fonction factorielle est très simple et dans ce cas, on préfère
l'utiliser plutôt que la version récursive.
• Un usage irréfléchi de fonctions récursives peut poser des problèmes d'exécution sur
certaines implémentations. En effet, si la récursivité est profonde i.e. les appels
récursifs sont nombreux, les fonctions sont appelées et ne retournent pas
immédiatement leur résultat donc les appels s'accumulent. Ces appels sont souvent
stockés dans une zone mémoire appelée "pile" et qui est de taille limitée. Si cette taille
est dépassée, on obtient une erreur à l'exécution ("une explosion de la pile").
Par exemple, si on exécute la fonction ci-dessus avec une valeur de n très grande, on
peut obtenir une erreur à l'exécution : ainsi, le code ci-dessous
#include <stdio.h>
/* Retourne le produit n*x où n>=0 */
int produit(int n, int x)
{
if (n > 0)
return produit(n - 1, x) + x;
else
return 0;
}
int main(void)
{
int n = 500000, x = 5;
10
ASD2 CHAPITRE 1 : Les sous-programmes : Fonctions et Procédures 1MI
/* derecursifier.c */
#include <stdio.h>
return temp;
}
int main(void)
{
/* on suppose que la valeur 500000 tient dans un int */
int n = 500000, x = 5;
Règle 1 :
Tout algorithme récursif doit distinguer plusieurs cas dont l’un au moins ne doit pas contenir
d’appels récursifs, sinon il y a risque de cercle vicieux et de calcul infini. Les cas non
récursifs d’un algorithme récursifs sont appelés cas de bases. Les conditions que doivent
satisfaire les données dans ces cas de bases sont appelées conditions de terminaison.
Règle 2 :
Tout appel récursif doit se faire avec des données plus proches de données satisfaisant les
conditions de terminaison.
7.4.Type de récursivité
7.4.1. Récursivité simple ou linéaire
Un algorithme récursif est simple ou linéaire si chaque cas qu’il distingue se résout en au plus
un appel récursif. Ainsi l’algorithme de calcul de n! est récursif simple.
Un algorithme récursif est multiple si l’un des cas qu’il distingue se résout avec plusieurs
appels récursifs.
11
ASD2 CHAPITRE 1 : Les sous-programmes : Fonctions et Procédures 1MI
Exemple :
Deux algorithmes sont mutuellement récursifs si l’un fait appel à l’autre et l’autre à l’un.
Parité d’un entier P(n) = prédicat de test de parité de l’entier n. I(n) = prédicat de test
d’imparité de l’entier n. Solution mutuellement récursive
12
ASD2 CHAPITRE 1 : Les sous-programmes : Fonctions et Procédures 1MI
Solution
#include <stdio.h>
void hanoi (int n, char A, char B, char C)
{
if(n==1)
printf("deplacer %c vers %c\n",A,C);
else
{
hanoi(n-1,A,C,B);
printf("deplacer %c vers %c\n",A,C);
hanoi(n-1,B,A,C);
}
}
main()
{
char a='a',b='b',c='c';
int n;
while(1)
{
printf("Entrer n : ");
scanf("%d",&n);
printf("\n");
hanoi(n,a,b,c);
}
}
13