Algorithmique
&
structures des données II
1ère Business Computing (BC)
Responsable : Dr. Fadoua Bouafif
1
Dr. Fadoua.BOUAFIF
Chapitre 2
La récursivité
2
Dr. Fadoua.BOUAFIF
Objectif du chapitre
3
Dr. Fadoua.BOUAFIF
A la fin du chapitre, les étudiants seront en mesure
de définir une fonction récursive afin de facilité la
manipulation d’un problème donné
Plan du chapitre
1. Introduction
2. Exemple introductive
3. Définitions
4. Avantages et inconvénients
5. Types de récursivité
6. Exercice d’application
7. Conclusion
2
Dr. Fadoua.BOUAFIF 4
Introduction
Dans la résolution d'un problème, ilarrive parfoisde répéter la même action.
Deux méthodes : la méthode itérative et la méthode récursive.
3
La méthode récursive est construite autour
d'une même fonction qui s'auto-appelle
jusqu'à atteindre la solution finale.
La méthode itérative se base sur la notion de boucles:
une même action est répétée un nombre fini de fois
(Pour/Répéter..jusqu’à/Tantque…faire,for/do…While/while).
La récursivité est donc une autre manière d’écrire des boucles sans l’utilisation
des structures de contrôle répétitives
Dr. Fadoua.BOUAFIF 5
8
Exemple introductive
Exemple: calculer le factoriel d’un entier n positif.
Principe :
On sait que:
n! = n*(n-1)*(n-2)*….*1
n!=n*(n-1)!
(n-1)! = (n-1)*(n-2)!
…
0! =1 // condition d'arrêt
Méthode itérative Méthoderécursive
Dr. Fadoua.BOUAFIF 6
Exemple introductive
En algorithmique
Fonction fact(n:entier):entier
var f:entier
Debut
f1
tantque (n>0) faire
ff*n
nn-1
fintanque
retourne(f)
Fin
Méthode itérative Méthode récursive
fonction fact(n : entier ) : entier
debut
si (n == 0) alors // condition d'arrêt
retourne (1)
sinon
retourne (n × fact(n − 1)) // appel récursif
fin si
fin
Dr. Fadoua.BOUAFIF 7
ASDII
Exemple introductive
En C
int fact(int n )
{
int f;
f=1;
while (n>0)
{
f=f*n;
n=n-1;
}
return(f);
}
Méthode itérative Méthode récursive
int fact(int n)
{
if (n ==0) // condition d'arrêt
return(1);
else
return (n× fact(n −1)); // appelrécursif
}
Dr. Fadoua.BOUAFIF 8
Calculer 3! Fact (3)
{
if (3==0) return 1;
return (3*Fact(2));
}
Fact (2)
{
if (2==0) return 1;
return (2*Fact (1));
}
Fact (1)
{
if (1==0) return 1;
return (1*Fact (0)));
}
1*1=1
2*1= 2
3*2=6
1
0! :Estla condition
d’arrêt pour la série
des auto appels.
Illustration de l’exemple
Dr. Fadoua.BOUAFIF 9
Définitions
La récursivité se définit,dans leslangages de programmations, par:
des fonctions récursives
ou des procéduresrécursives.
Un sous-programmeest dit récursif,s’il contient au moins un énoncé d'appel, direct ou
indirect, à lui-même dans son corps.
Tout processus récursif peut être exprimé par son équivalent itératif l'inverse n'est pas
toujoursvalable.
La récursivité est trèsutilisée dans la programmation dynamique (listes,arbres, graphe, etc.).
4
Dr. Fadoua.BOUAFIF 10
Avantages et inconvénients
Avantages Inconvénients
Simplifier l'écriture des programmes, puisque
les calculs à effectuer ne sont pas définis
explicitement.
Faciliter la tâche au programmeur, qui
n'aura plus à préciser le nombre de répétition
de la même action, ni à gérer les différentes
valeurs des variables utilisées.
Exiger un grand espace mémoire lors
de l'exécution
Générer une infinité d'appels lorsque la
condition d'arrêt n'est pas atteinte.
5
Dr. Fadoua.BOUAFIF 11
Types de récursivité
La récursivité peut être:
6
Directe (Simple) Indirecte
Dr. Fadoua.BOUAFIF 12
Simple ou Rapide ou directe:le sous-programme s'appelle lui-même
Syntaxe:
7
La récursivité Directe (Simple)
Sous-programme P1
debut
…..
… ..
appel de P1
fin
Dr. Fadoua.BOUAFIF 13
8
La récursivité Directe (exemple)
Exemple: écrire un sous-programme récursif qui permet de calculer le carré d’un entier n positif.
Principe :
On sait que: (n+1)2 = n2 +2n +1
sionremplacenparn-1n2 =(n-1)2 +2(n-1)+1=(n-1)2 +2n-1
donc
carrer(n)=carrer(n-1)+2n-1
D’oùsin=0alorscarrer(n)=0 conditiond’arret
Dr. Fadoua.BOUAFIF 14
La récursivité Directe (exemple)
Dr. Fadoua.BOUAFIF 15
Croisée ou indirecte :deux sousprogrammes s'appellent l'unl'autre.
Le premier appelle le second,
Le second appelle le premier,
etc.
Syntaxe:
Sous-programme P1
debut
…..
…..
appel deP2
fin
11
La récursivité Indirecte
Sous-programme P2
debut
…..
…..
appel deP1
fin
Dr. Fadoua.BOUAFIF 16
En algorithme
fonction pair (n:entier ):booleen
debut
si(n==0)alors // condition d'arrêt
retourne(vrai)
sinon retourne (impair (n−1))
fin si
fin
fonction impair (n:entier ):booleen
debut
si(n==0)alors // condition d'arrêt
retourne (faux)
sinon retourne (pair (n−1))
finsi
fin
EN C
int pair (intn)
{
if (n==0) // conditiond'arrêt
return 1;
else return(impair (n-1));
}
int impair (intn)
{
if (n==0)// conditiond'arrêt
return 0;
else return(pair (n-1));
}
12
La récursivité Indirecte (exemple)
Exemple: écrire un sous-programme récursif qui permet d’envoyer la parité d’un entier n positif.
Principe: Un nombre n peut-être soit pair :n =2*k soit impair :n =2*k+1
17
Exercice d’application
Écrire un sous-programme récursif en C qui testesiun mot estun palindrome.
Un mot palindrome qui se lit de droite à gauche ou de gauche à droite exp: radar
Solution:
Condition d’arrêt: debut >= fin la chaine est palindrome
Appel récursive:
chaine [debut]!=chaine[fin] la chaine n’est pas palindrome
chaine[debut] =
=chaine[fin]
palindrome (chaine, debut++,fin--)
Dr. Fadoua.BOUAFIF 18
Exercice d’application (correction )
}
Dr. Fadoua.BOUAFIF 19
Conclusion
Pour réussir un sous-programme récursif, ilest nécessaire de biendéfinir
la condition d'arrêt du sous-programme.
Tout sou-programme récursif peut être transcrit en un sous-
programme itératif. l'inverse n'est pas toujours valable.
13
Dr. Fadoua.BOUAFIF 20

Ch2_ la récursivité.pdf

  • 1.
    Algorithmique & structures des donnéesII 1ère Business Computing (BC) Responsable : Dr. Fadoua Bouafif 1 Dr. Fadoua.BOUAFIF
  • 2.
  • 3.
    Objectif du chapitre 3 Dr.Fadoua.BOUAFIF A la fin du chapitre, les étudiants seront en mesure de définir une fonction récursive afin de facilité la manipulation d’un problème donné
  • 4.
    Plan du chapitre 1.Introduction 2. Exemple introductive 3. Définitions 4. Avantages et inconvénients 5. Types de récursivité 6. Exercice d’application 7. Conclusion 2 Dr. Fadoua.BOUAFIF 4
  • 5.
    Introduction Dans la résolutiond'un problème, ilarrive parfoisde répéter la même action. Deux méthodes : la méthode itérative et la méthode récursive. 3 La méthode récursive est construite autour d'une même fonction qui s'auto-appelle jusqu'à atteindre la solution finale. La méthode itérative se base sur la notion de boucles: une même action est répétée un nombre fini de fois (Pour/Répéter..jusqu’à/Tantque…faire,for/do…While/while). La récursivité est donc une autre manière d’écrire des boucles sans l’utilisation des structures de contrôle répétitives Dr. Fadoua.BOUAFIF 5
  • 6.
    8 Exemple introductive Exemple: calculerle factoriel d’un entier n positif. Principe : On sait que: n! = n*(n-1)*(n-2)*….*1 n!=n*(n-1)! (n-1)! = (n-1)*(n-2)! … 0! =1 // condition d'arrêt Méthode itérative Méthoderécursive Dr. Fadoua.BOUAFIF 6
  • 7.
    Exemple introductive En algorithmique Fonctionfact(n:entier):entier var f:entier Debut f1 tantque (n>0) faire ff*n nn-1 fintanque retourne(f) Fin Méthode itérative Méthode récursive fonction fact(n : entier ) : entier debut si (n == 0) alors // condition d'arrêt retourne (1) sinon retourne (n × fact(n − 1)) // appel récursif fin si fin Dr. Fadoua.BOUAFIF 7
  • 8.
    ASDII Exemple introductive En C intfact(int n ) { int f; f=1; while (n>0) { f=f*n; n=n-1; } return(f); } Méthode itérative Méthode récursive int fact(int n) { if (n ==0) // condition d'arrêt return(1); else return (n× fact(n −1)); // appelrécursif } Dr. Fadoua.BOUAFIF 8
  • 9.
    Calculer 3! Fact(3) { if (3==0) return 1; return (3*Fact(2)); } Fact (2) { if (2==0) return 1; return (2*Fact (1)); } Fact (1) { if (1==0) return 1; return (1*Fact (0))); } 1*1=1 2*1= 2 3*2=6 1 0! :Estla condition d’arrêt pour la série des auto appels. Illustration de l’exemple Dr. Fadoua.BOUAFIF 9
  • 10.
    Définitions La récursivité sedéfinit,dans leslangages de programmations, par: des fonctions récursives ou des procéduresrécursives. Un sous-programmeest dit récursif,s’il contient au moins un énoncé d'appel, direct ou indirect, à lui-même dans son corps. Tout processus récursif peut être exprimé par son équivalent itératif l'inverse n'est pas toujoursvalable. La récursivité est trèsutilisée dans la programmation dynamique (listes,arbres, graphe, etc.). 4 Dr. Fadoua.BOUAFIF 10
  • 11.
    Avantages et inconvénients AvantagesInconvénients Simplifier l'écriture des programmes, puisque les calculs à effectuer ne sont pas définis explicitement. Faciliter la tâche au programmeur, qui n'aura plus à préciser le nombre de répétition de la même action, ni à gérer les différentes valeurs des variables utilisées. Exiger un grand espace mémoire lors de l'exécution Générer une infinité d'appels lorsque la condition d'arrêt n'est pas atteinte. 5 Dr. Fadoua.BOUAFIF 11
  • 12.
    Types de récursivité Larécursivité peut être: 6 Directe (Simple) Indirecte Dr. Fadoua.BOUAFIF 12
  • 13.
    Simple ou Rapideou directe:le sous-programme s'appelle lui-même Syntaxe: 7 La récursivité Directe (Simple) Sous-programme P1 debut ….. … .. appel de P1 fin Dr. Fadoua.BOUAFIF 13
  • 14.
    8 La récursivité Directe(exemple) Exemple: écrire un sous-programme récursif qui permet de calculer le carré d’un entier n positif. Principe : On sait que: (n+1)2 = n2 +2n +1 sionremplacenparn-1n2 =(n-1)2 +2(n-1)+1=(n-1)2 +2n-1 donc carrer(n)=carrer(n-1)+2n-1 D’oùsin=0alorscarrer(n)=0 conditiond’arret Dr. Fadoua.BOUAFIF 14
  • 15.
    La récursivité Directe(exemple) Dr. Fadoua.BOUAFIF 15
  • 16.
    Croisée ou indirecte:deux sousprogrammes s'appellent l'unl'autre. Le premier appelle le second, Le second appelle le premier, etc. Syntaxe: Sous-programme P1 debut ….. ….. appel deP2 fin 11 La récursivité Indirecte Sous-programme P2 debut ….. ….. appel deP1 fin Dr. Fadoua.BOUAFIF 16
  • 17.
    En algorithme fonction pair(n:entier ):booleen debut si(n==0)alors // condition d'arrêt retourne(vrai) sinon retourne (impair (n−1)) fin si fin fonction impair (n:entier ):booleen debut si(n==0)alors // condition d'arrêt retourne (faux) sinon retourne (pair (n−1)) finsi fin EN C int pair (intn) { if (n==0) // conditiond'arrêt return 1; else return(impair (n-1)); } int impair (intn) { if (n==0)// conditiond'arrêt return 0; else return(pair (n-1)); } 12 La récursivité Indirecte (exemple) Exemple: écrire un sous-programme récursif qui permet d’envoyer la parité d’un entier n positif. Principe: Un nombre n peut-être soit pair :n =2*k soit impair :n =2*k+1 17
  • 18.
    Exercice d’application Écrire unsous-programme récursif en C qui testesiun mot estun palindrome. Un mot palindrome qui se lit de droite à gauche ou de gauche à droite exp: radar Solution: Condition d’arrêt: debut >= fin la chaine est palindrome Appel récursive: chaine [debut]!=chaine[fin] la chaine n’est pas palindrome chaine[debut] = =chaine[fin] palindrome (chaine, debut++,fin--) Dr. Fadoua.BOUAFIF 18
  • 19.
    Exercice d’application (correction) } Dr. Fadoua.BOUAFIF 19
  • 20.
    Conclusion Pour réussir unsous-programme récursif, ilest nécessaire de biendéfinir la condition d'arrêt du sous-programme. Tout sou-programme récursif peut être transcrit en un sous- programme itératif. l'inverse n'est pas toujours valable. 13 Dr. Fadoua.BOUAFIF 20