Atelier de Programmation C II
Cours 2:
La récursivité en C
1
2024 / 2025
Semestre II
Réalisé par: Dhouha Maatar
Nadia Ben Said
2
PLAN
 Définition
 Structure générale d’une fonction récursive
 Exemple: Factorielle
 Exemple: Fibonacci
 Applications
3
Définition
Une fonction récursive est 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
L’itération et la ré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
La fonction récursive est 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.
6
Type_Resultat Nom_Fonction(paramétres)
{
if(/*condition d’arrêt*/)
//traitement
else
// appel récursif;
}
7
Exemple: fonction factorielle n!
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
Exemple: fonction factorielle
Considérons l’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
Exemple: fonction factorielle
Le problè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
Exemple: fonction factorielle
Exécution
Exemple Calcul 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
Exemple: fonction de Fibonacci
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
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
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
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));
}
15
FIN

La récursivité.coursAPROGC2.LangageC.ppt

  • 1.
    Atelier de ProgrammationC II Cours 2: La récursivité en C 1 2024 / 2025 Semestre II Réalisé par: Dhouha Maatar Nadia Ben Said
  • 2.
    2 PLAN  Définition  Structuregénérale d’une fonction récursive  Exemple: Factorielle  Exemple: Fibonacci  Applications
  • 3.
    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.
  • 6.
  • 7.
    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)); }
  • 15.

Notes de l'éditeur

  • #3 Autrement dit, dans le corps même de la fonction on trouve l’appelle de celle-ci
  • #4 #include<stdio.h> void fonction_recursive() { printf("je suis un fonction recursive\n"); fonction_recursive(); } main() { fonction_recursive(); }