La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

2005/2006 Structures de données Introduction à la récursivité

Présentations similaires


Présentation au sujet: "2005/2006 Structures de données Introduction à la récursivité"— Transcription de la présentation:

1 2005/2006 Structures de données Introduction à la récursivité

2 Récursivité2 Raisonnement par récurrence (Math) Exemple : Montrer que : Preuve : Cas de base : n = 0 : (Vrai) n = 1 :(Vrai) Récurrence : Hypothèse : S(n) est vrai, n>1 montrer que S(n+1) est vrai

3 Récursivité3 00ii )( 2 )2)(1( )1 2 1( )1( 2 )1( vrai nnn n n nn )1()()1()()1( 1 nnSniinS nn hypothèse de récurrence

4 Récursivité4 Équations de récurrence Base : S(0) = 0 Récurrence : S(n+1) = S(n)+(n+1) La récursivité est un mécanisme de calcul puissant Résoudre un problème de taille n peut se ramener à la résolution dun (plusieurs) sous problème(s) de taille plus réduite...

5 Récursivité5 Action récursive une action A est exprimée de façon récursive si la décomposition de A fait appel à A (une procédure/fonction qui sappelle elle-même est dite récursive) Action calculer S(n) : Appliquer les deux règles suivantes: 1) S(0) = 0 (règle de base) 2) S(n) = S(n-1) + n, n>0 (règle de récurrence) S(3) ? = S(2) +3 = (S(1)+2 ) +3 = ((S(0)+1)+2)+3 = ((0+1)+2)+3 = 6

6 Récursivité6 Objet récursif La définition dun objet est récursive lorsquelle se formule en utilisant lobjet même quelle entend définir Exemple (déf. récursive dune chaîne) Une chaîne de caractères est : soit la chaîne vide soit un caractère suivi dune chaîne de caractères

7 Récursivité7 Exemple (suite) Daprès la définition précédente : " a " est une chaîne : un caractère a suivi dune chaîne vide " ab " est une chaîne : un caractère a suivi de la chaîne "b" La récursivité est un mécanisme puissant de définition dobjets

8 Récursivité8 Récursivité vs Itération procédure Itération( ) tantque (condition) faire fin tantque procédure Itération( ) si (condition) alors Itération() finsi fonction S(n) : entier s 0 tant que (n>0) faire s s+n n n-1 fin tant que retourner s fonction S(n) : entier Si (n=0) alors retourner 0 sinon retourner S(n-1)+n fin si ItérationRécursivité

9 9 Récursivité : applications Exemple 1 : calcul de la factorielle Équations de récurrence : 0! = 1 (base) n! = n*(n-1)! (récurrence) fonction fact(d n:entier): entier si n = 0 alors retourner 1 sinon retourner n * fact(n-1) fin si fin action Que se passe-t-il si n <0? récursivité infinie

10 Récursivité10 Récursivité : applications La fonction factorielle en Java int fact(int n) // doit être déclarée dans une classe //précondition : n 0 { if (n==0) return 1; else return n * fact(n-1); }

11 Récursivité11 Récursivité : applications La fonction factorielle : exécution fact(4) if(4==0) return 1; else return 4*fact(3); if(3==0) return 1; else return 3*fact(2); if(2==0) return 1; else return 2 * fact(1); if(1==0) return 1; else return 1 * fact(0);

12 Récursivité12 Récursivité : applications La fonction factorielle : exécution (suite) fact(4) if(4==0) return 1; else return 4*6; if(3==0) return 1; else return 3 * 2; if(2==0) return 1; else return 2 * 1; if(1==0) return 1; else return 1 * fact(0);

13 Récursivité13 Récursivité : applications Exemple 2 : suite de fibonacci Équations de récurrence : u(0) = 0, u(1) = 1 (Base) u(n) = u(n-1)+u(n-2), n>1 (récurrence) fonction u(d n:entier) : entier si (n=0) ou (n=1) alors retourner n sinon retourner u(n-1) + u(n-2) fin si fin action

14 Récursivité14 Récursivité : applications suite de Fibonacci en Java int fib(int n) // doit être déclarée dans une classe //précondition : n 0 { if (n<2) return n; else return fib(n-1) + fib(n-2); }

15 Récursivité15 Récursivité : applications suite de Fibonacci : exécution fib(4) ? fib(4) fib(3) fib(2) fib(1) fib(0) fib(1) fib(0) Résultat = 3 appel : retour :

16 Récursivité16 Récursivité : applications Suite de Fibonacci (suite) O(2 n-1 ) appels à la fonction fib pour n = 100, O(2 99 ) O(10 30 ) !!! Une solution récursive nest pas toujours viable solution itérative

17 Récursivité17 Récursivité : applications Suite de fibonacci : solution itérative int fib(int n) {int x, y, z, i; if(n<2) return n; else { // u(0) x = 0;// u(0) y= 1;// u(1) for(i=2;i<=n; i++) { z = x+y;// u(n) = u(n-1)+u(n-2) x = y; y = z; } return z; }

18 Récursivité18 Récursivité : applications Les Tours de Hanoï (TH) 3 axes, n disques concentriques de taille différente But : déplacer tous les disques de G à D Règles : 1 seul disque peut être déplacé à la fois 1 disque ne peut jamais être déposé sur un plus petit 1 disque ne peut être déposé que sur G, M ou D G(auche) n M(ilieu)D(roite)

19 Récursivité19 Récursivité : applications TH : idée de la solution récursive exprimer le problème des n disques à laide de la même solution sur n-1 disques (base) savoir résoudre le problème pour 1 disque Équations de récurrence G(auche) M(ilieu)D(roite) (n=1)

20 Récursivité20 Récursivité : applications G(auche)M(ilieu)D(roite) 13 2 (n=2) (n=3) …, bonne chance Récurrence : n Hypothèse: on connaît la solution pour n disques n+1 Trouver la solution pour n+1 disques

21 Récursivité21 Récursivité: applications G(auche) n M(ilieu)D(roite) n+1 1(hypo) 2 3(hypo) Solution procédure déplacer(n, G, M, D) " déplacer n disques de G vers D en utilisant laxe M " (Base) n=1, déplacer un disque de G vers D (récurrence) déplacer(n-1, G, D, M) déplacer un disque de G vers D déplacer(n-1, M, G, D)

22 Récursivité22 Récursivité : applications void deplacer(int n, char G, char M, char D) { if (n==1) //cas de base System.out.println( "déplacer le disque de " + G + " vers " + D ); else //récursivité { deplacer(n-1, G, D, M); deplacer(1, G, M, D); deplacer(n-1, M, G, D); } public static void main(String [] args) { deplacer(4, g, m, d); }

23 Récursivité23 Récursivité : pile dexécution(exemple) procédure P(d n : entier, r s : entier) variable c : entier début si (n = 0) alors s 0 sinon c n mod 10 P(n div 10, s) s s +c fin si fin Programme PP variable nb 37, sc : entier début P(nb, sc); afficher ("somme des chiffres de", nb, "est ", sc) fin nb sc PP n s P c 3 3 n s P c 37 7 n s P c Pile dexécution 37

24 Récursivité24 Récursivité mutuelle (croisée) Récursivité directe : une fonction sappelle elle-même Récursivité indirecte : une fonction appelle dautres fonctions qui appellent dautres fonctions qui appellent la fonctions initiale Récursivité mutuelle : deux fonctions sappellent mutuellement (cest une forme de récursivité indirecte)

25 Récursivité25 Récursivité mutuelle (croisée) Récursivité directe Récursivité indirecte Récursivité mutuelle f() g() f() h()g()f()

26 Récursivité26 Récursivité terminale Un appel récursif est terminal si aucune instruction n'est exécutée après l'appel récursif. L'appel récursif est la dernière instruction exécutée Un algorithme en récursivité terminale est équivalent à une boucle tantque Exemple : void f(int i) { if(i>0) { System.out.println(i); f(i-1); }

27 Récursivité27 Récursivité non terminale Quand l'appel récursif ne termine pas la fonction, on parle de récursivité non-terminale. Il y a des instructions à exécuter après l'appel récursif. La suppression de la récursivité non-terminale est plus difficile, il faut utiliser une pile. Exemple : void f(int i) { if(i>0) { f(i-1); System.out.println(i); }

28 Récursivité28 Récursivité Conclusion La récursivité est un principe puissant nous permettant : de définir des structures de données complexes de simplifier les algorithmes opérants sur ces structures de données Pour certains problèmes, une solution itérative est préférable à une solution récursive Il est possible de transformer un algorithme récursif en un algorithme itératif. On dit "dérécursiver" lalgorithme


Télécharger ppt "2005/2006 Structures de données Introduction à la récursivité"

Présentations similaires


Annonces Google