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

Post on 04-Apr-2015

110 views 4 download

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

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

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

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 ...

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

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

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

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é

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

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

}

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

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

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

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

}

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 ++

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

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;

}}

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)

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)

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

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)

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

}

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

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)

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

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

}}

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

}}

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