2005/2006 structures de données introduction à la récursivité

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

Upload: norbert-perez

Post on 04-Apr-2015

110 views

Category:

Documents


4 download

TRANSCRIPT

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

2005/2006

Structures de données

Introduction à la récursivité

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

Récursivité 2

Récursivité

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

2

)1()(

0

nninS

n

i

12

)11(110)1(

1

0

i

iS

02

)10(00)0(

0

0

i

iS

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

Récursivité 3

Récursivité

00 ii

)(2

)2)(1()1

2)(1(

)1(2

)1(

vrainnn

n

nnn

)1()()1()()1(

1

nnSniinSnn

hypothèse de récurrence

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

Récursivité 4

Récursivité

É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 npeut se ramener à la résolutiond’un (plusieurs) sous problème(s) de taille plus réduite ...

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

Récursivité 5

Récursivité

Action récursiveune action A est exprimée de façon récursive si la décomposition de A fait appel à A (une procédure/fonction qui s’appelle 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

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

Récursivité 6

Récursivité

Objet récursif La définition d’un objet est récursive lorsqu’elle se formule en utilisant l’objet même qu’elle entend définir

Exemple (déf. récursive d’une chaîne)

Une chaîne de caractères est :• soit la chaîne vide• soit un caractère suivi d’une chaîne de

caractères

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

Récursivité 7

Récursivité

Exemple (suite)D’après la définition précédente :   "a" est une chaîne :

un caractère ‘a’ suivi d’une 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 d’objets

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

Récursivité 8

Récursivité vs Itération

procédure Itération( )

tantque (condition) faire

<Instructions>

fin tantque

procédure Itération( )si (condition) alors

<Instructions>Itération()

finsi

fonction S(n) : entiers 0tant que (n>0) faire

s s+nn n-1

fin tant queretourner s

fonction S(n) : entierSi (n=0) alors

retourner 0sinon retourner S(n-1)+nfin si

Itération Récursivité

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

Récursivité 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): entiersi n = 0 alors retourner 1sinon retourner n * fact(n-1)fin si

fin action

Que se passe-t-il si n <0? récursivité infinie

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

Récursivité 10

Récursivité : applications

La fonction factorielle en Javaint fact(int n) //doit être déclarée dans une classe

//précondition : n0{

if (n==0)return 1;

elsereturn n * fact(n-1);

}

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

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);

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

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);

11

22

662424

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

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) : entiersi (n=0) ou (n=1) alors retourner nsinon retourner u(n-1) + u(n-2)fin si

fin action

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

Récursivité 14

Récursivité : applications

suite de Fibonacci en Javaint fib(int n) //doit être déclarée dans une classe

//précondition : n0{

if (n<2)return n;

elsereturn fib(n-1) + fib(n-2);

}

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

Récursivité 15

Récursivité : applications

suite de Fibonacci : exécution fib(4) ?

fib(4)

fib(3) fib(2)

fib(2) fib(1) fib(1) fib(0)

fib(1) fib(0)

33 22

22 11

11 00

1100

Résultat = 3

appel : retour :

22 11++

0011 ++

0011 ++

1111 ++

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

Récursivité 16

Récursivité : applications

Suite de Fibonacci (suite)

O(2n-1) appels à la fonction fib

pour n = 100 , O(299) O(1030) !!!

Une solution récursive n’est pas toujours

viable solution itérative

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

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 {

x = 0; // u(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;

}}

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

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 à DRè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)

nn

M(ilieu) D(roite)

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

Récursivité 19

Récursivité : applications

TH : idée de la solution récursiveexprimer le problème des n disques à l’aide 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)

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

Récursivité 20

Récursivité : applications

G(auche) M(ilieu) D(roite)

1 32

(n=2)(n=3) …, bonne chance

Récurrence :Hypothèse: on connaît la solution pour nn disques

Trouver la solution pour n+1n+1 disques

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

Récursivité 21

Récursivité: applications

G(auche)

nn

M(ilieu) D(roite)

n+11(hypo)1(hypo)

22

3(hypo)3(hypo)

Solution procédure déplacer(n, G, M, D) " déplacer n disques de G vers D en utilisant l’axe 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)

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

Récursivité 22

Récursivité : applications

void deplacer(int n, char G, char M, char D){

if (n==1) //cas de baseSystem.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’);

}

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

Récursivité 23

Récursivité : pile d’exécution(exemple)

procédure P(d n : entier, r s : entier)variable c : entier

débutsi (n = 0) alors s 0sinon

c n mod 10P(n div 10, s)s s +c

fin sifinProgramme PP

variable nb 37, sc : entierdébut P(nb, sc); afficher ("somme des chiffres de", nb, "est ", sc)

fin

nbscPP

ns

Pc

3

3

ns

Pc

37

7

ns

Pc

0

0 3 10

Pile d’exécution

37

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

Récursivité 24

Récursivité mutuelle (croisée)

Récursivité directe : une fonction s’appelle

elle-même

Récursivité indirecte : une fonction appelle d’autres fonctions qui appellent d’autres fonctions qui appellent la fonctions initiale

Récursivité mutuelle : deux fonctions

s’appellent mutuellement (c’est une forme de

récursivité indirecte)

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

Récursivité 25

Récursivité mutuelle (croisée)

Récursivité directe

Récursivité indirecte

Récursivité mutuelle f()f() g()g()

f()f()

h()h()

g()g()

f()f()

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

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);

}}

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

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);

}}

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

Récursivité 28

Récursivité

ConclusionLa 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" l’algorithme