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