36
Structures de données IFT-2000 Abder Alikacem Abder Alikacem La récursivité Semaine 5 Département d’informatique et de génie logiciel Édition Septembre 2009

Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Embed Size (px)

Citation preview

Page 1: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Structures de donnéesIFT-2000

Abder AlikacemAbder Alikacem

La récursivité

Semaine 5

Département d’informatique et de génie logiciel

Édition Septembre 2009

Page 2: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Plan du cours

Notions de base Exemple simple (fonction factorielle) Limitations (suite de Fibonacci) Tours de Hanoï Recherche binaire (ou dichotomique) Sous-séquence de somme maximale Backtracking

Page 3: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Notions de base

DéfinitionUn objet est récursif s'il est défini à partir de lui-même. Une fonction est récursive si elle peut s'appeler elle-même de façon directe ou indirecte

Quand ? Suite récurrentes (exemple : factorielle) Type récursifs

Liste non vide = premier + listeArbre binaire = racine + sous-arbre droit + sous-arbre gauche

(semaine 10)

Page 4: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Récursivité

Idée générale :La réalisation d'une tâche par un algorithme récursifrepose sur deux éléments:

La résolution partielle du problème d'une façon simple. La réalisation du reste de la tâche étant déléguée aux appels récursifs successifs.

La détermination d'une condition d'arrêt qui permet d'arrêter la cascade d'appels récursifs. Résoudre le problème au moment où la condition d'arrêt est détectée correspond en général à résoudre un cas trivial de celui-ci.

Page 5: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Récursivité

Quatre règles régissent la récursivité:

1. Trouver la récursion2. Présence de cas de base pouvant être résolu sans récursivité3. Toujours progresser vers le cas de base à chaque appel récursif4. Vérifier que les appels récursifs progressent réellement vers le

cas de base.5. Intérêt composé: Ne jamais dédoubler du travail dans deux

appels récursifs différents (voir la fonction récursive de Fibonacci).

Page 6: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Récursivité

Structure générale d’une fonction récursive

{if(/* !!condition de convergence */)

…;

if(/*condition d’arrêt*/)return(/*Ce qu’elle doit retourné*/);

else

appel récursif

}

Traitement

Page 7: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Fonction récursive factorielle

Soit la fonction Factorielle, effectuant l’opération n!

int fact (int n){ if (n < 0) throw logic_error(Fact:argument <

0 );if (n = = 0) return 1;else return (n * fact (n-1));

}

Règle récursive : fact(n) = n * fact (n-1)Condition d’arrêt : fact (0) =1Condition de convergence: n 0

Page 8: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Pile des contextes

La notion de récursivité très liée au concept des piles.

A chaque appel d’une fonction récursive, les arguments transmis par valeur et les variables locales sont empilés.

Ces valeurs constituent le contexte d’activation de l’appel. A chaque retour le contexte situé en haut de la pile est

disponible Les contextes sont indépendants

Ainsi, lorsqu'une fonction est appelée, ses paramètres formels, l'adresse de retour et les variables locales (automatiques) de la fonction appelée sont déposés sur la pile. Toutes ces données sont retirées de la pile à la finde l'exécution de la fonction. Conséquemment, lors d'appels récursifs, les variables de la fonction sont empilées en cascade.

Page 9: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Exécution de factorielle(3)

Retour au point appelant

Pile vide

(dépiler)

Return (3 *2)N=3(dépiler) => 1

Return (2 *1)N=2(dépiler) => 2

Return (1*1)N=1(dépiler) => 3

Return(1)N=04 (empiler)

N*fact(0)N=13 (empiler)

N*fact(1)N=22 (empiler)

N*fact(2)N=31 (empiler)

N° appel N° retour Contexte Action

Page 10: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Avantages et inconvénients

Solution naturelle et facile à concevoir si la fonction est récursive quand la structure de données traitée est récursive

Avantages Formulation compacte, claire et élégante. Maîtrise des problèmes dont la nature même est récursive.

Désavantages Possibilité de grande occupation de la mémoire. Temps d'exécution peut être plus long. Estimation difficile de la profondeur maximale de la récursivité.

Page 11: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Limitations: Fonction récursive Fibonnacci

Soit la fonction Fibo (Fibonacci), effectuant l’opération f(n) = f(n-1) + f(n-2)

long fibo (long valeur){ if (valeur< 0) throw logic_error(Fibo:argument <

0 );

if (valeur <= 1) return valeur; else

return(fibo(valeur-1) + fibo(valeur-2));}

Page 12: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Exécution de Fibonnacci

Soit les appels effectués pour fibo(n) :

fibo(n)

fibo(n-2)

fibo(n-4)

fibo(n-6) fibo(n-5)

fibo(n-3)

fibo(n-1)

fibo(n-2)fibo(n-3)

Règle 5: Ne jamais dupliquer le travail par la résolution d’une même instance d’un problème dans plusieurs appels récursifs.

fibo(n-3)fibo(n-4)

Page 13: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Danger de Fibonnacci

Note :• Cette fonction récursive effectue plusieurs appels au même calcul.

Par exemple pour déterminer f(n), on calcule d’abord f(n-1), puis au retour de l’appel, f(n-2) est calculé. Or, dans le calcul de f(n-1), f(n-2) est déjà calculé!

• Ce problème s’aggrave en descendant l’arborescence, puisque f(n-3) sera appelé à 3 reprises : chaque appel récursif entraînera de plus en plus d’appel redondant.

• Règle 5: Ne jamais dupliquer le travail par la résolution d’une même instance d’un problème dans plusieurs appels récursifs.

Page 14: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Champs d'application des algorithmes récursifs

• Structures de données définies récursivement (listes, arbres, graphes, etc.)

• Équations de récurrence (algébriques, vectorielles, booléennes, formelles, ensemblistes, etc.);

• Rétroaction ("backtracking").• …

Nous allons voir ensemble quelques exemples typiques sur la récursivité.

Page 15: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Les tours de Hanoï

Problème : • Soit n tours de tailles décroissantes sur un socle A, transférer

les n tours sur le socle B en utilisant un socle intermédiaire C.

Socle A Socle B Socle C

Déplacement d’une tour : on ne peut empiler qu’une tour de plus petite taille sur une autre tour

Page 16: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Paramétrage

void Hanoi(int n, socle& A, socle& B, socle&C);

n : nombre de toursA : socle de départ (valeur initiale : suite de n tours

décroissantes)B : socle de d’arrivée (valeur initiale : vide)C : socle intermédiaire (valeur initiale : vide)

Page 17: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Les tours de Hanoï : résolution

Socle A Socle B Socle C

Socle A Socle B Socle C

Page 18: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

RESOLUTION RECURSIVE

Cas trivial (arrêt)n=1 : il suffit de déplacer l’unique tour de A vers B

Règle récursiven>1 : Hanoi (n-1, A ,C, B)

Déplacer (A,B) Hanoi (n-1, C, B, A)

Page 19: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

FONCTION HANOI

void Hanoi (int n, socle& A, socle& B, socle&C){if (n = = 1) Déplacer (A,B);else {

Hanoi (n-1,A,C,B);Déplacer (A,B);Hanoi (n-1,C,B,A);

}}

A : départ B : arrivée C: intermédiaire

Page 20: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

ARBRE DES APPELS (n=3)

Déplacer (A,B)

Déplacer (A,C)

Hanoi (3,A,B,C)

Hanoi (2,A,C,B)

Hanoi (1,B,C,A)Hanoi (1,A,B,C)

Déplacer (A,B) Déplacer (B,C)

Hanoi (2,C,B,A)

Déplacer (C,A)

Déplacer (C,B)

Déplacer (A,B)

Page 21: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Recherche binaire (dichotomique)

Idée générale :• La recherche d’une valeur particulière dans un tableau ordonné

se fait par divisions successives du tableau en deux parties. Le fait que le tableau soit ordonné permet de déterminer rapidement la moitié dans laquelle se trouve l’élément recherché.

Page 22: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Recherche binaire programmation non-récursive

int RechercheBinaire( int * tab, int debut, int fin,int val){

int i = debut - 1; int j = fin + 1; while ( i+1 != j) {

int milieu = (i+j)/2; if ( val < tab[milieu]) j = milieu; if (val == tab[milieu]) return milieu; if (val> tab[milieu]) i = milieu;

} return -1;}

Page 23: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Fonction récursive pour la recherche binaire

int rechercheBinaire(int * tab, int debut, int fin, int val){

int milieu;if (debut > fin) return -1; else {

milieu= (debut + fin)/2; if( val == tab[milieu]) return milieu; else {

if( val < tab[milieu]) return(rechercheBinaire(tab,val,debut, milieu-1)); else {

return(rechercheBinaire(tab,val,milieu+1,fin)); }}

}}

Page 24: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Sous-séquence de somme maximale

Définition:

Étant donnée des entiers (possiblement négatifs) A1, A2,. . . , AN, trouver et

identifier la séquence correspondante à la valeur maximale de .

j

ik kA

Résolution:Application de la technique de diviser et conquérir (divide-and-

conquer), uneMéthode de résolution de problèmes basée sur la récursivité:

Diviser en plusieurs sous problèmes résolus récursivement.

Conquérir, où la solution du problème original est composé de la solution des sous-problèmes.

Page 25: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Sous-séquence de somme maximale

Cas possible:Cas possible:

Cas 1: La séquence est situé dans la première moitié. Cas 2: La séquence est situé dans la deuxième moitié. Cas 3: La séquence commence dans la première moitié et se

termine dans la deuxième moitié.

Sommaire de l’algorithme:

1. Déterminer récursivement la sous-séquence de somme maximale uniquement dans la première moitié.

2. Déterminer récursivement la sous-séquence de somme maximale uniquement dans la deuxième moitié.

3. Avec deux boucles consécutives, déterminer la sous-séquence de somme maximale qui débute dans la première moitié et qui termine dans la deuxième moitié.

4. Choisir la somme la plus élevée des trois.

Page 26: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

SousSequence trancheMax4(Sequence t, int d, int f){

SousSequence rep = { 0, 0, t[0] };int m = (d+f)/2;

if(d==f){rep.debut=d; rep.fin=f; rep.somme= t[d]; return rep;} Sousequence sm1 = trancheMax4(t, d, m); Sousequence sm2 = trancheMax4(t, m+1, f); int s1=t[m]; int s1m=s1; int dmg=m; for(int k = m-1; k>=d; --k) s1+=t[k]; if(s1>s1m){s1m=s1; dmg=k;

int s2=t[m+1]; int s2m=s2; int dmd=m+1; for(int k = m+2; k<=f; ++k) s2+=t[k]; if(s2>s2m){s2m=s2; dmd=k;

int sm3 = s1m+s2m; if(sm1.somme>=sm2.somme && sm1.somme>=sm3){ return sm1;} if(sm2.somme>=sm1.somme && sm2.somme>=sm3){ return sm2;} rep.debut= dmg; rep.fin = dmd; rep.somme= sm3; return rep;}

Page 27: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Sous-séquence de somme maximale (Exemple)

3 2 -5 -1 0 -1 2

3 2 -5 -1 0 -1 2

3 2 -5 -1 0 -1 2

2 -5 -1 0 -1 2

2

3

2 -5 -1 0 -1

0 12

00 0

-5

max(2,-5,2-5)

2

max(3,2,3+2)

3

-1 0

max(-1,0,-1+0)

-1 2

max(-1,2,-1+2)

max(0,2,0+1)

max(5,2,0+0)=5

Page 28: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Algorithme à essais successifs (AES)

Problématique Pour résoudre certains types de problèmes, il peut être souvent utile

de procéder à l'exploration systématique des différentes solutions possibles. Il est donc essentiel de développer des techniques algorithmiques qui permettent une telle exploration.

AES ou encore algorithme de back tracking idée : construire progressivement une solution à un problème donné

en essayant toutes les possibilités à chaque étape de la construction.

Remarque : la complexité de ce genre d ’algorithme est de nature exponentielle => à utiliser si l ’on n ’en connaît pas de meilleur.

Page 29: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Backtracking

Exemple. Calcul du trajet du robot

Il s'agit de concevoir un algorithme qui permet à un robot de trouver un chemin menant à la sortie d'un labyrinthe. Pour ce faire le robot explore systématiquement les quatre directions vers lesquelles il peut se déplacer. De plus, afin d'éviter que le robot ne se retrouve sur des cases déjà explorées chacune de celles-ci seront marquées à mesure qu'elles sont visitées. C'est de façon récursive que les cases faisant partie du chemin seront identifiées.

Page 30: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Algorithme du retour-arrière

Page 31: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Plan du site

N

EO

S

Légende

: point de départ

: point d’arrivée

: mur ou obstache

E

S

0

A B C D E F G H I

S

E1

2

3

4

5

6

Page 32: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Programmation du trajet d’un robot mobile

#define Y 9 /* Les dimensions du labyrinthe */#define X 7char laby[X][Y] = { {'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'}, {'X', ' ', ' ', 'X', ' ', ' ', ' ', ' ', 'X'}, {'X', ' ', 'X', 'X', ' ', 'X', 'X', ' ', 'X'}, {'X', ' ', ' ', ' ', ' ', ' ', 'X', 'X', 'X'}, {'X', 'X', 'X', ' ', 'X', ' ', 'X', ' ', 'X'}, {'X', 's', ' ', ' ', ' ', ' ', ' ', ' ', 'X'}, {'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'}};int main(){ int i, j; bool Parcours(int x, int y); if (Parcours(1,1)) { // Imprimer le résultat de la recherche for (i = 0; i < X; i++, cout<<endl) for (j = 0; j < Y; j++) cout<<laby[i][j]; } else cout<<"Il n'existe aucun chemin.\n"; return 0;}

Page 33: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Programmation du trajet d’un robot mobile (suite)

bool Parcours(int x, int y){ if (laby[x][y] == 's') { /* on a trouvé la sortie */ laby[x][y] = 'S'; return true; } else if (laby[x][y] == ' ') { /* la case est libre */ laby[x][y] = 'o'; /* marquer la case visitée */ if (Parcours(x-1, y)) /* Parcours nord */ return(true); else if (Parcours(x, y+1)) /* Parcours est */ return(true); else if (Parcours(x+1, y)) /* Parcours sud */ return(true); else if (Parcours(x, y-1)) /* Parcours ouest */ return(true); else laby[x][y] = '-'; /* on laisse une marque */ } return false;}

Page 34: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Retour en arrière - exercice

• Quel est le chemin parcouru? Combien de retours en arrière?

• Utiliser des appels récursifs et l’ordre d’appel suivant:• Nord• Sud• Est• Ouest

0 1 2 3 4 5 6 7 8 9

A

B S

C

D

E

F EG

H

I

J

Page 35: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Retour en arrière - exercice

0 1 2 3 4 5 6 7 8 9

A

B S

C

D

E

F EG

H

I

J

bool Parcours(int x, int y){ if (laby[x][y] == 's') { laby[x][y] = 'S'; return true; } else if (laby[x][y] == ' ') { laby[x][y] = 'o'; if (Parcours(x-1, y)) return(true); else if (Parcours(x+1, y)) return(true); else if (Parcours(x, y+1)) return(true); else if (Parcours(x, y-1)) return(true); else laby[x][y] = '-'; } return false;}

Page 36: Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009

Retour en arrière - réponse

0 1 2 3 4 5 6 7 8 9

A

B

C

D

E

F

G

H

I

J

X

E

S

oo

o

o

oo X

X

o

o

o

o

o

o o o

o

oX

o

o o

o

o o o

o

o

o

o o

oX

Xo

o