Objectif Les algorithmes qui s’appellent eux mêmes Algorithmes et Structures de Données Chapitre 2 - La récursivité Algorithmes récursifs Base, partie strictement récursive Principe de fonctionnement Exemples Capocchi Laurent [email protected] http://spe.univ-corse.fr/capocchiweb Université de Corse - IUP NTIC2 2005/2006 – Algorithme et Structure de Données Université de Corse - IUP NTIC2 2005/2006 – Algorithme et Structure de Données Définitions Définitions «Une procédure récursive est une procédure récursive» Une pile est une zone mémoire réservée à chaque programme Technique ou concept défini en fonction de lui même Directement ou indirectement Le rôle de la pile est stocker les variables locales et les paramètres d'une procédure Elle permet de résoudre certains problèmes d'une manière rapide comparé à la technique itérative Dans une procédure récursive, toutes les variables locales sont stockées dans la pile et empilées autant de fois qu'il y a d'appels récursifs. La récursivité utilise toujours la pile du programme en cours Attention aux remplissages abusifs entraînant les débordement de pile En fin de programme les variables sont désempilées Université de Corse - IUP NTIC2 2005/2006 – Algorithme et Structure de Données Université de Corse - IUP NTIC2 2005/2006 – Algorithme et Structure de Données Base, partie strictement récursive Base, partie strictement récursive Une définition récursive est composée de deux parties: Une partie non récursive: une instruction (ou bloc d'instructions) nommée « point d'arrêt » qui indique que le reste des instructions ne doit pas être exécuté. Une partie strictement récursive fonction maFonction ( ….. ) : TypeDeRetour variables locales : ….. si ( fin ) alors ….. Condition d'arrêt sinon maFonction ( ….. ) finsi Appel retourner ( valeur ) récursif finFonction c Université de Corse - IUP NTIC2 2005/2006 – Algorithme et Structure de Données Principe de fonctionnement Une fonction récursive « f » peut être appelées depuis son propre corps de fonction Soit directement: si la fonction « f » appelle directement « f », on dit que la récursivité est directe Soit indirectement à travers une ou plusieurs fonctions relais: si « f » appelle une fonction « f1 », qui appelle une fonction « f2 », ..., qui appelle une fonction « fn » et qui enfin appelle « f » on dit qu'il s'agit d'une récursivité indirecte. Université de Corse - IUP NTIC2 2005/2006 – Algorithme et Structure de Données Principe de fonctionnement La question qui se pose dans la définition d'une fonction récursive est celle de la condition d'arrêt de la récursivité Les paramètres de l'appel récursif doivent toujours changer Exemple: calcul de la somme des n premier entiers positifs somme(n) = n + somme(n-1) et somme(1) = 1 fonction somme ( n : NatuelNonNul) : NatuelNonNul variable locale temp : NatuelNonNul si (n==1) retourner 1 sans le test sinon si (n==1), la temp ← somme(n-1) fonction ne retourner n + temp s'arrêterait jamais ! finSi FinFonction somme Université de Corse - IUP NTIC2 2005/2006 – Algorithme et Structure de Données Sinon l'ordinateur fait un appel infini à la procédure récursive impliquant un débordement de la pile Le changement de valeurs conduit l'ordinateur à rencontrer un ensemble de paramètres vérifiant le test d'arrêt indiquant que la procédure récursive aura atteint le fond (point terminal) Les paramètres ainsi que les variables locales sont désemplilées au fur et à mesure qu'on remonte les niveaux Université de Corse - IUP NTIC2 2005/2006 – Algorithme et Structure de Données Exemple (1) Exemple (2) somme(4) création du premier temp somme(3) création du deuxième temp somme(2) création du troisième temp somme(1) Trace de la création du quatrième temp fonction somme destruction de temp pour n = 4 retourne 1 destruction de temp retourne 2+1 destruction de temp retourne 3+3 destruction de temp retourne 4+6 Université de Corse - IUP NTIC2 2005/2006 – Algorithme et Structure de Données Exemple (2) Combi('abc', ' ') procédure combinaison (st, tete: ChaineCaractère) variables locales i: Entier si ( longueur(st) = 1) alors affiche(tete+st) sinon pour i=1 jusqu'à longueur(st) faire combinaison(copie(st, 1, longueur(st)-1)), tete+st[0]) st <- copie(st, 1, longueur(st)-1) + st[0]) finpour finsi fincombinaison Université de Corse - IUP NTIC2 2005/2006 – Algorithme et Structure de Données Exemple (2) Paramètre: st <- 'abc'; tete <- ' ' i<-1 combi('bc', 'a') Paramètre: st <- 'bc'; tete <- 'a' i<-1 combi('c', 'ab') Point d'arrêt: on affiche 'ab'+'c' soit 'abc' st <- 'cb' i <- 2 combinaison('b','ac') Point d'arrêt: on affiche 'ac'+'b' soit 'acb' st <- 'bc' // valeur qui n'a plus d'importance st <- 'bca' i <- 2 combi('ca','b') Université de Corse - IUP NTIC2 2005/2006 – Algorithme et Structure de Données st <- 'bca' i <- 2 combi('ca','b') Paramètre: st <- 'ca'; tete <- 'b' i<-1 combi('a', 'bc') Point d'arrêt: on affiche 'bc'+'a' soit 'bca' st <- 'ac' i <- 2 combinaison('c','ba') Point d'arrêt: on affiche 'ba'+'c' soit 'bac' st <- 'ca' // valeur qui n'a plus d'importance st <- 'ca'+b'='cab' i <- 3 combi('ab','c') Université de Corse - IUP NTIC2 2005/2006 – Algorithme et Structure de Données Exemple (2) Remarques st <- 'ca'+b'='cab' i <- 3 combi('ab','c') Paramètres: st <- 'ab'; tete <- 'c' i<-1 combi('b', 'ca') Point d'arrêt: on affiche 'ca'+'b' soit 'cab' st <- 'ba' i <- 2 combinaison('a','cb') Point d'arrêt: on affiche 'cb'+'a' soit 'cba' Lorsqu'une fonction récursive définit des variables locales, un exemplaire de chacune d'entre elles est créée à chaque appel récursif de la fonction Exemple somme(4), la variable locale temp est créée 4 fois Ces variables sont restituées au fur et a mesure que l'on quitte la fonction comme toute variables locale d'un fonction Attention au dépassement de mémoire et à la définition abusive de variables st <- 'ab' // valeur qui n'a plus d'importance st <- 'ab'+'c'='abc' //valeur qui n'a plus d'importance Université de Corse - IUP NTIC2 2005/2006 – Algorithme et Structure de Données Structure de données récursives Université de Corse - IUP NTIC2 2005/2006 – Algorithme et Structure de Données Exercices Transformer une boucle en une procédure récursive Une structure de données récursives tout comme une définition récursive, est une structure qui fait référence à elle même Transformer 2 boucles imbriquées en une procédure récursive Les structures de données naturellement récursives sont les listes, les arbres, ... Inverser une chaîne de caractères Calculer la factorielle d'un entier Dire si une chaîne de caractères est un palindrome Afficher les anagramme d'une chaîne de caractères Afficher le triangle de Pascal Donner l'algorithme récursif des tours de Hanoi Tracer une maison sans lever le crayon Université de Corse - IUP NTIC2 2005/2006 – Algorithme et Structure de Données Université de Corse - IUP NTIC2 2005/2006 – Algorithme et Structure de Données Bibliographie et Webographie A. CHAMBILY, P. CONSTANTINE, La récursivité pas à pas C. PAOLI, Cours d'algorithmes et structures de données Université de Corse - IUP NTIC2 2005/2006 – Algorithme et Structure de Données