Algorithmes récursifs

publicité
Algorithmes récursifs
Licence 1 MASS - Algorithmique et Calcul Formel
S. Verel, M.-E. Voge
www.i3s.unice.fr/∼verel
23 mars 2007
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Objectifs de la séance 3
écrire des algorithmes récursifs avec un seul test
rechercher un élément dans un tableau par dichotomie
récursivement
Questions principales du jour :
Comment écrire ce que l’on ne connait pas encore ?
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Plan
1
Principe de la récursivité
Decendre ou monter un escalier
Couper un gâteau
2
Algorithmes récursifs
Définition
Algorithmes classiques
3
Résolution de problèmes par récursivité
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Decendre ou monter un escalier
Couper un gâteau
Les puissances de a
Objectif :
Calculer an en "travaillant" le moins possible
⇒ on sait que an = a × an−1 ...
Itératif : chouette ! on connaît a0 ! ! !
Récusif : si seulement on connaissait an−1 ...
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Decendre ou monter un escalier
Couper un gâteau
L’escalier & la puissance
an = a × an−1
depart arrivee
arrivee
n
n
depart
1
ITERATIF
0
a^0 = 1
1
RECURSIF
0
a^0 = 1
départ : info connue
départ : info cherchée
monter vers résultat
descendre vers connue
arêt en haut : n
arêt en bas : 0
monter vers résultat
→ boucle pour
→ comment ? ? ?
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Decendre ou monter un escalier
Couper un gâteau
Construction de l’algorithme récursif
on sait :
1
monter/descendre d’une marche : an = a × an−1
2
a0 = 1
mais : plusieurs marches ...
comment faire le reste du travail ?
Solution : appel récursif
l’agorithme fait une partie du travail (descendre/monter une
marche)
demande à un algorithme de faire le reste : lui même
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Decendre ou monter un escalier
Couper un gâteau
Exemple d’exécution
Calcul de la puissance
Algorithme puissance(a : réel, n : entier): : réel
début
si n = 0 alors
retourner 1
sinon
retourner puissance(a, n-1) * a
fin si
fin
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Decendre ou monter un escalier
Couper un gâteau
Exemple d’exécution
Calcul de la puissance
Calcul de (1.5)3 : a = 1.5 et n = 3.
1. puissance(1.5, 3)
2. —–> puissance(1.5, 2)
3. ———-> puissance(1.5, 1)
4. —————-> puissance(1.5, 0) = 1
5. ———-> puissance(1.5, 1) = 1 * 1.5 = 1.5
6. —–> puissance(1.5, 2) = 1.5 * 1.5 = 2.25
7. puissance(1.5, 3) = 2.25 * 1.5 = 3.375
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Decendre ou monter un escalier
Couper un gâteau
Autre problème : le PGCD
monter/descendre : PGCD(a, b) = PGCD(b, a modulo b)
PGCD(a, 0) = a
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Decendre ou monter un escalier
Couper un gâteau
Exemple du calcul du pgcd
Algorithme PGCD(a, b : entier): : entier
début
1: si b = 0 alors
2:
retourner a
3: sinon
4:
c ← a modulo b
5:
retourner PGCD(b, c)
6: fin si
fin
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Decendre ou monter un escalier
Couper un gâteau
Exécution de l’algorithme
Pour a = 72 et b = 34
1.
2.
5.
6.
2.
5.
6.
2.
5.
6.
2.
3.
PGCD(72, 34)
b 6= 0
c =4
PGCD(34, 4)
b 6= 0
c =2
PGCD(4, 2)
b 6= 0
c =0
PGCD(2, 0)
b=0
PGCD = 2
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Decendre ou monter un escalier
Couper un gâteau
Une autre vision de la récursivité
Problème : manger un gâteau
énorme gâteau,
seulement une bouchée à la fois,
on sait couper en deux tout morceau de gâteau,
⇒ on le coupe en petits morceaux et on les mange !
Exemple : recherche dichotomique dans un tableau trié
tableau T de n cases,
vérifier seulement une case à la fois,
on sait réduire la taille de T (jouer sur les indices),
⇒ on le coupe en petits tableaux et on cherche dans chacun !
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Decendre ou monter un escalier
Couper un gâteau
Recherche dichotomique
Recherche dans un tableau de nombres entiers ordonnés
Algorithme recherche(n :entier, t :tableau d’entiers, a, b : entier): : booléen
variable c : entier
début
si a > b alors
retourner Faux // il ne reste plus de cases à vérifier
sinon
c ← (a + b)/2 // on coupe
si t[c] = n alors
retourner Vrai // on est tombé juste sur la bonne case
sinon
si t[c] < n alors
retourner recherche(n, t, c+1, b) // on cherche dans une partie
sinon
retourner recherche(n, t, a, c-1) // on cherche dans l’autre
fin si
fin si
fin si
fin
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Decendre ou monter un escalier
Couper un gâteau
Exécution de l’algorithme
t: 2
1.
1.
1.
2.
2.
2.
3.
3.
3.
3.
4.
5.
5
6
8
11
15
20
recherche(6, t, 0, 6) 2 5 6 8 11 15 20
c =3
t[3] > 6
—–> recherche(6, t, 0, 2) 2 5 6 8 11 15 20
c =1
t[1] < 6
———-> recherche(6, t, 2, 2) 2 5 6 8 11 15 20
c =2
t[2] = 6
———-> recherche(6, t, 2, 2) = Vrai
—–> recherche(6, t, 0, 2) = Vrai
recherche(6, t, 0, 6) = Vrai
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Decendre ou monter un escalier
Couper un gâteau
Points communs et IMPORTANTS
1
appel récursif UNIQUEMENT sur données plus petites
marche du dessous : n − 1 au lieu de n, (b,a mod b) au lieu de
(a,b),
demi-morceau de gâteau : demi-tableau,
2
faire le travail pour passer à des données plus petites
monter/descendre une marche : n en fonction de n − 1,
couper le gt̂eau,
3
identifier les cas à résoudre sans appel récursif :
première marche : n = 0, (a, 0),
bouchée de gâteau : une case de tableau,
4
s’arrêter à temps, plus de sens sinon :
dernière marche : n < 0,
plus que des bouchées : a > b : pas de case,
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Decendre ou monter un escalier
Couper un gâteau
Structure de ces algorithmes : exemple du PGCD
Base : où on s’arrête, pas d’appel récursif
si b = 0 alors
retourner a
sinon
...
fin si
Hérédité : calcul à partir de paramètres plus "petits"
si b = 0 alors
...
sinon
...
retourner PGCD(b, c)
fin si
fin
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Définition
Algorithmes classiques
Définition (informelle)
Algorithmes récursifs
Un algorithme récursif est un algorithme qui fait appel à lui-même
dans le corps de sa propre définition.
Il existe deux types d’algorithmes récursifs :
les algorithmes récursifs qui se terminent :
au bout d’un nombre fini d’opérations, l’algorithme s’arrête.
les algorithmes récursifs qui ne se terminent pas :
on peut imaginer que l’algorithme continue "éternellement" de
calculer.
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Définition
Algorithmes classiques
Exemples
Algorithme calcul1(n : entier): : réel
début
si n = 0 alors
retourner 2
sinon
retourner 21 (n − 1) + 2
fin si
fin
calcul1 n’est pas un algorithme résursif
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Définition
Algorithmes classiques
Exemples
Algorithme calcul2(n : entier): : réel
début
si n = 0 alors
retourner 2
sinon
retourner 21 calcul2(n-1) +2
fin si
fin
calcul2 est un algorithme résursif qui se termine
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Définition
Algorithmes classiques
Exemples
Algorithme calcul3(n : entier): : réel
début
si n = 0 alors
retourner 2
sinon
retourner 21 calcul3(n-2)+2
fin si
fin
calcul3(n) est un algorithme résursif :
si n est pair, calcul3 se termine
si n est impair, calcul3 ne se termine pas
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Définition
Algorithmes classiques
A méditier
Calcul de la puissance
Algorithme puissanceTerminale(a : réel, n : entier, acc : réel): :
réel
début
si n = 0 alors
retourner acc
sinon
retourner puissanceTerminale(a, n − 1, acc ∗ a)
fin si
fin
Comment s’exécute cet algorithme ? puissanceTerminale(1.5, 3, 1)
récursivité terminale : équivalent à une itération
→ résultat final donné par appel récursif
→ condition de "base" = condition arêt boucle tantque
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Définition
Algorithmes classiques
Intérêts
bien adapté à la résolution de certains problèmes (et pas
seulement mathématiques !)
algorithmes souvent moins "laborieux" à écrire :
moins de variables, beaucoups moins de boucles.
une résolution par algorithme récursif nécessite souvent de
prendre du recul pour résoudre le problème (avantage !)
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Définition
Algorithmes classiques
Parallèle entre principe de récurrence et algorithme récursif
définition mathématique par récurrence
très proche
définition d’un algorithme récursif (cf. puissance)
Modes de calcul proches :
a3 = a.a2 = a.a.a1 = a.a.a
Souvent, définition mathématique valide lorsque algorithme récursif
associé se termine.
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Définition
Algorithmes classiques
Parallèle entre principe de récurrence et algorithme récursif
Base : initialisation de la récurrence
si b = 0 alors
retourner a
sinon
...
fin si
Hérédité : calcul à partir de paramètres plus "petits"
si b = 0 alors
...
sinon
...
retourner PGCD(b, c)
fin si
fin
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Définition
Algorithmes classiques
Calcul de la factorielle
Factorielle
n! =
1,
n.(n − 1)!,
si n = 0
sinon
Algorithme factorielle(n : entier): : entier
début
si n = 0 alors
retourner 1
sinon
retourner n * factorielle(n-1)
fin si
fin
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Définition
Algorithmes classiques
Exécution de l’algorithme
Calcul de 3!.
1. factorielle(3) = 3 * factorielle(2)
2. —–> factorielle(2) = 2 * factorielle(1)
3. ———-> factorielle(1) = 1 * factorielle(0)
4. —————-> factorielle(0) = 1
5. ———-> factorielle(1) = 1 * 1 = 1
6. —–> factorielle(2) = 2 * 1 = 2
7. factorielle(3) = 3 * 2 = 6
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Définition
Algorithmes classiques
Recherche dichotomique
Recherche d’un mot dans un dictionnaire
début
pages de recherche <- dictionnaire
tant que mot lu n’est pas le mot recherché faire
lire mot médian des pages de recherche
si le mot lu est plus petit que mot recherché alors
pages de recherche <- pages à droite du mot lu
sinon
pages de recherche <- pages à gauche du mot lu
fin si
fin tant que
retourner (mot lu)
fin
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Définition
Algorithmes classiques
Recherche dichotomique
Recherche d’un mot dans un dictionnaire
Algorithme recherche(m : mot, l : liste): : booléen
variable lu : mot
début
lu ← median(l)
si lu = m alors
retourner Vrai
sinon
si lu < m alors
retourner recherche( liste à droite de lu)
sinon
retourner recherche( liste à gauche de lu)
fin si
fin si
fin
−→ Incomplet (jamais Faux) ! !
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Définition
Algorithmes classiques
Recherche dichotomique
Recherche d’un mot dans un dictionnaire
Algorithme recherche(m : mot, l : liste): : booléen
variable lu : mot
début
si l est vide alors
retourner Faux
sinon
lu ← median(l)
si lu = m alors
retourner Vrai
sinon
si lu < m alors
retourner recherche( liste à droite de lu)
sinon
retourner recherche( liste à gauche de lu)
fin si
fin si
fin si
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Quand utiliser un algorithme récursif ?
Est-ce que le problème dépend d’un (ou plusieurs)
paramètre(s) ?
Est-il possible de résoudre le problème lorsque la (les) valeur(s)
du paramètre est "petite(s)" ?
Est-il possible de résoudre le problème à l’aide de la résolution
du problème portant sur une (des) "plus petite(s)" valeur(s)
du paramètre ?
Si oui, oui, oui
alors la résolution par un algorithme récursif est à envisager.
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Tours de Hanoï (Édouard Lucas 1842 - 1891)
Le problème des tours de Hanoï consiste à déplacer N disques de
diamètres différents d’une tour de départ à une tour d’arrivée en
passant par une tour intermédiaire et ceci en un minimum de
coups, tout en respectant les règles suivantes :
on ne peut déplacer plus d’un disque à la fois,
on ne peut placer un disque que sur un autre disque plus grand
que lui ou sur un emplacement vide.
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Comment résoudre ce problème ?
Est-ce que le problème dépend d’un (ou plusieurs)
paramètre(s) ?
−→ Oui le nombre de disques.
Est-il possible de résoudre le problème lorsque la (les) valeur(s)
du paramètre est "petite(s)" ?
−→ Oui lorsque le nombre de disque est 1.
Est-il possible de résoudre le problème à l’aide de la résolution
du problème portant sur une (des) "plus petite(s)" valeur(s)
du paramètre ?
−→ Oui...
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Algorithme récursif
Algorithme hanoi(n : entier, A : caractère, B : caractère, C :
caractère ): : rien
début
si n = 1 alors
écrire("déplacer ", A, " vers ", C)
sinon
hanoi(n-1, A, C, B) ;
écrire("déplacer ", A, " vers ", C)
hanoi(n-1, B, A, C) ;
fin si
fin
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Exécution de l’algorithme
Hanoi(2, ’a’, ’b’, ’c’)
Hanoi(3, ’a’, ’b’, ’c’)
Hanoi(4, ’a’, ’b’, ’c’)
Quel est le nombre de déplacements en fonction de n ?
Pour tout entier n ≥ 1, Cn = 2n − 1. A démontrer par récurrence...
Pour n = 64, les moines d’Hanoi y sont encore...
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Somme des cubes
Calculer S(n) = 13 + 23 + 33 + . . . + n3
Est-ce que le problème dépend d’un (ou plusieurs)
paramètre(s) ?
−→ Oui n.
Est-il possible de résoudre le problème lorsque la (les) valeur(s)
du paramètre est "petite(s)" ?
−→ Oui pour n = 0 ou n = 1
Est-il possible de résoudre le problème à l’aide de la résolution
du problème portant sur une (des) "plus petite(s)" valeur(s)
du paramètre ?
−→ Oui, S(n) = S(n − 1) + n3
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Somme des cubes
Algorithme
Algorithme sommeCube(n : entier): : entier
début
si n = 0 alors
retourner 0
sinon
retourner sommeCube(n-1) +n3
fin si
fin
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Exécution de l’algorithme
Calcul de S(3)
1. sommeCube(3)
2. —–> sommeCube(2)
3. ———-> sommeCube(1)
4. —————-> sommeCube(0) = 0
5. ———-> sommeCube(1) = 0 + 13 = 1
6. —–> sommeCube(2) = 1 + 23 = 9
7. sommeCube(3) = 9 + 33 = 18
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Régionnement du plan
Etant donné un nombre n de droites, calculer le nombre Rn
maximum de régions du plan obtenus
Est-ce que le problème dépend d’un (ou plusieurs)
paramètre(s) ?
−→ Oui le nombre n de droites.
Est-il possible de résoudre le problème lorsque la (les) valeur(s)
du paramètre est "petite(s)" ?
−→ Oui pour n = 0 ou n = 1
Est-il possible de résoudre le problème à l’aide de la résolution
du problème portant sur une (des) "plus petite(s)" valeur(s)
du paramètre ?
−→ Oui, en comptant le nombre régions ajoutées lorsqu’on
ajoute une droite à n − 1 droites : une région supplémentaire
par droite coupée, plus une dernière région.
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Régionnement du plan
Algorithme
Algorithme region(n : entier): : entier
début
si n = 0 alors
retourner 1
sinon
retourner region(n-1) +n
fin si
fin
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Objectifs de la séance 3
écrire des algorithmes récursifs comme par exemple celui
calculant la factorielle et recherchant un élément par
dichotomie
Questions principales du jour :
Comment écrire ce que l’on ne connait pas encore ?
S. Verel, M.-E. Voge
Algorithmes récursifs
Principe de la récursivité
Algorithmes récursifs
Résolution de problèmes par récursivité
Travail de documentation
Trouver de la documentation en rapport avec l’ensemble de
l’enseignement.
Quels sont vos premières références ?
S. Verel, M.-E. Voge
Algorithmes récursifs
Téléchargement