3
Définition
Une fonction récursiveest une fonction qui fait appel à elle-même.
A( )
{……
…….
A( );
…….
}
La récursivité est une manière simple et élégante de résoudre certains
problèmes algorithmiques.
Elle permet:
d'écrire des programmes beaucoup plus lisibles
d'écrire d'une manière très rapide (par rapport d’une manière itérative)
d’utiliser le principe diviser-pour-résoudre.
4.
4
L’itération et larécursivité permettent d’accomplir des tâches
répétitives.
La récursivité est une autre manière d’écrire des boucles sans
l’utilisation des structures de contrôle répétitives(for , do..while , ou
while)
5.
5
La fonction récursiveest composée de deux partie:
La condition d'arrêt (une partie non récursive ): Elle doit correspondre
au cas “le plus simple” qu’on veut traiter et qui permet d’arrêter la récursion
.
Cas général: la fonction est appelée récursivement et le résultat retourné
et calculé en utilisant le résultat de l’appel récursif.
A chaque appel récursif la valeur d’au moins un des paramètres (effectifs)
de la fonction doit changer.
o Il faut toujours s’assurer que chaque cas général
converge vers la condition d’arrêt.
o Il est nécessaire d'éviter un nombre infini d'appels à la
même fonction sinon la machine se plante.
7
Exemple: fonction factoriellen!
4!=4*3*2*1=24
Itératif
n!=n*n-1*…*2*1
int factorielle(int n){
int i,f = 1;
for(i= n; i >=1;i--)
f = f*i;
return f;
}
Récursif
n!=n*(n-1)!
int fact(int n)
{
return(n*fact(n-1));
}
8.
8
Exemple: fonction factorielle
Considéronsl’expression itérative de la factorielle :
N ! = N * (N-1) * (N-2) *…*2*1
Il est aussi possible d’écrire la même expression d’une autre manière :
N ! = N* (N-1) !
Dans cette dernière expression, la factorielle de N est définie en fonction de la
factorielle de N-1.
C’est ce qu’on appelle récursivité puisque la fonction factorielle a besoin
d’elle-même pour pouvoir être fonctionnelle.
On peut constater que ce code s'appelle lui-même en passant comme nouveau
paramètre le même entier diminué de 1, il est donc récursif.
9.
9
Exemple: fonction factorielle
Leproblème est qu'il ne s'arrêtera jamais car on appelle fact
systématiquement.
Pour calculer N ! il faut savoir calculer (N-1) !, et pour calculer (N-1) !, il faut
savoir calculer (N-2) ! jusqu’à 0 ! qui est égal à 1 et qui permet à la récurrence
de s’arrêter.
On doit donc cesser d'appeler fact dès que n vaut 0.
Il faut ajouter donc la condition d'arrêt à la fonction dès que n vaut 0:
Version précédente Version correcte
int fact(int n)
{
return(n*fact(n-1));
}
int fact(int n)
{
if(n==0)
return(1);
else
return(n*fact(n-1));
}
10.
10
Exemple: fonction factorielle
Exécution
ExempleCalcul de Fact (4) :
La fonction qui fait un appel récursif
se met en attente du résultat de cet
appel; quand on arrive à un cas
simple, il y a retour du résultat vers
les fonctions en attente jusqu’à ce
qu’on remonte à la fonction initiale
qui a effectué le premier appel.
11.
11
Exemple: fonction deFibonacci
En mathématique, une suite U appelée suite de Fibonacci est définie par :
U(n) = U(n-1) + U(n-2) si n>1
avec U(0) = 1 ou U(1)=1
int fibo ( int n )
{
if (( n == 0 )|| n== 1)
return (1);
else
return (fibo (n-1) + fibo (n-2))
}
12.
12
Applications
Application 1 :Ecrire une fonction récursive puissance qui prend comme
paramètres deux entiers a et n et retourne a à la puissance n.
Remarque : on va supposer que n >=0 et a>0.
int puissance ( int a, int n )
{
if (n==0)
return 1;
else
if(n==1)
return a;
else
return ( a* puissance(a, n-1));
}
13.
13
Applications
Application 2 :Ecrire une fonction récursive qui calcule le nombre de chiffres
d’un entier n.
Exemple : n = 36543 => 5 chiffres
nbr_chiffres(36543) = nbr_chiffres(3654) + 1
= nbr_chiffres(365) + 1 +1
= nbr_chiffres(36) + 1 +1 +1
= nbr_chiffres(3) + 1 + 1 + 1 +1
= 1 + 1 + 1 +1+ 1
int nbr_chiffres ( int n )
{
if (n / 10 == 0 )
return (1) ;
else
return( 1 +nbr_chiffres (n / 10 )) ;
}
14.
14
Applications
Application 3 :Ecrire une fonction récursive qui calcule la somme des éléments
d’un tableau T.
int som_tab (int T[ ], int n)
{
if ( n== 1 )
return ( T[n-1] ) ;
else
return ( T[n-1] + som_tab( T,n-1));
}