Algorithmes et Structures de Données

publicité
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
Téléchargement