Ch2 Algorthmique Avancée - Récursivité1. •ommaire
• Introduction
« Objets récursifs
• Méthodes récursives
• Divide & Conquer
© L. B. Romdhane, Ph.D. • Principe d'exécution
• Arbre d'exécution
DSI / FSM / UM / Tunisie
• Preuve de terminaison
© L. H. Riundbane; FSM.TN
BJETS RECURSIFS (1)
• John McCarthy (MIT / Stanford) II est parfois difficile de définir un objet directement
• Algolôo ( ancêtre de Pascal, PL/1 et C) II est plus simple de définir cet objet en fonction
• Lisp : structures de données et traitements récursifs de lui-même
• Implémentation en langage de programmation Exemple - chaîne de caractères
• au début : certains n'implémentait pas ce concept a) Classique : Une chaîne de caractères est une suite de
(COBOL, Fortran) caractères
• actuellement : tous les langages b) Récursive : Une chaîne de caractères est soit la chaîne
* Objets (structures de données) récursives vide; soit un caractère suivi d'une chaîne de caractère
* Méthodes (procédures et fonctions) récursives
L. B.Romdhanc; FSM.TN 6 L. B. Romdhane; FSM.TN
2. OBJETS RECURSIFS (2) -T5MDE&CONQUER(1)
• Objet récursif: le nombre de composantess (objets) est 0 Diviser pour régner : un p r i n c i p e l n n d . u n r n i . i l p n n r
résoudre des problèmes informatiques COmplexei
illimité ?
• Idée- résoudre un problème S(n) de / < / ! / / < • u m Ir
• La nécessité d'un point d'appui divisant en plusieurs sous-problèmes de même n . i i n i v
• un objet particulier permettant de limiter le nombre S(n}, S(n-), ..., S(nk) telque(n,< n); Vs e o m l u n n
d'objets dans la définition les solutions pour obtenir celle de S(n)
• La notion de taille dépend de la nature du p r o b l è m e !
• Objet récursif : • Tri : le nombre d'éléments à trier
• soit un objet particulier; • Factoriel : la valeur de l'entier
• soit une composante + un objet récursif • Constitue le principe fondamental de la récursivité
> L. B. Runidliane; FSM.TN I L. B. Romdhane; FSM.TN
-T5ÎVÎDE & CONQUER'{2) "tfJVÎDE & CONQÛÏRlIT
1. Diviser : si la taille du problème est inférieur à un Algorithme Solve (I)
Début
certain seuil, alors le résoudre directement en allant
n<- taille(I)
chercher parmi un ensemble de cas particuliers sinon Si (n < seuil) alors solution <- directlySolve(I)
Sinon
le diviser en un ensemble de sous-problèmes
« diviser / en It, I 2 , ..., Ik
2. Régner : Résoudre récursivement les sous- • Pour i de i à k faire
S,<-Salvf:(I}
problèmes selon le même principe Fin Pour
• Solution <— combiner^,,..., Sk )
3. Combiner : les solutions des sous-problèmes pour
Fin Si
constituer la solution du problème original Fin.
i !.. B, Rumdhane; FSM.TN © L. B. Rumiihani-i FSM.TN
ASI)
3. 'MÉTHODES RECURSÎVES (1)
j Une méthode est dite récursive, si elle fait appel à La suite de Fibonacci fonction fibo ( In n : entier)
elle-même entier
• Un = U^ + Un.z VAR
Méthode myRecursMethod ( ListeParam )
• Ui = i; Uo = o fi, fa, f : entier
Environment Début
Début: , . 1 Si ((n = o) OU (n=i))
directlySolve(n) : .............,.,,,.„„_ a!ors f <_ n
sinon
myRecursMethod ( ListeParam) fi (— fibo (n -i)
1. Diviser
h <— fibo (n -2)
2. Régner
Fin.
Fin Si
« Nécessité d'une condition d'arrêt qui sera vraie à un 3. Composer j" retourner (f )
instant ultérieur de l'exécution Fin.
«5 L. M. Ruiiiiilitinc; KSM.TN L. B. Romdliane; FSM.TN
-METHODES RECURSIVES (3) Algorithme CalcFib
RCrjRST7fs4)
fibo
• Environnement d'une méthode contient les VAR X : entier ? : "valeur indéfinie"
Début fz:?
informations suivantes : X <- fibo (3) @ : ligne i
• variables locales & paramètres de la méthode Fin. main
fonction ilbo( in n : entier) : entier
x:?
• variables locales du compilateur VAR fl, G, f: entier
Début
• @ de retour dans la méthode appelante; etc. 1. Si (n = 0)OU(n=l) fibo
n :2 fi:?
• Les appels à une méthode sont stockés dans une pile 2. ulvrs f <— n
fi:?
3. sîiiun
d'exécution (frame stack) 4. f 1 <- fibo (n -1)
@ : ligne i, 4
11:3 fibo
• Empiler un nouveau environnement par appel récursif 5. f2 «- fibo (n -2) n:3 fi;?
6. f * - f l + f 2 £2:? f:?
• Dépiler si la méthode s'est terminée FiiiSi
7. retourner (f) main
Fin.
iO L. B, Roruiihane; FSM.TN AS!) ) L. B. Romilhane; FSM.TN
AS1>
4. -^IViETHODES RECURSIVES -"-IVTÉTHODES RECURSIVES(6)
fibo <dD fibo <j fibo <j fibo <f fibo Cq ^ fibo <^ u
n :i fi:? n : i fi:? n : i fi: ? n : o fi:? n : o fi;? n : o fi:?
fa:? f:? f z : ? f :i fa : ? f : i fa :? f : ? fa:? f : o fa:? f:o
@ : ligne i @ : ligne 2 @ : ligne 7 @ : ligne i @ : ligne 2 @ : ligne 7
fibo fibo fibo fibo <; fibo fibo fibo fibo A zî fibo ç
J-
n :a fi: ? n : 2 fi:? n :2 fi:? n : 2 fi: i n ; 2 fin n : 2 fi :i n : 2 fi:i n : 2 fi:i n:i fi:?
f a : ? f :? fa:? f:? fa : ? f : ? fa : ? f : ? fa:? f : ? h: ? f : ? f a : ? f :? fa :o f :i fz : ? f : ?
@ : ligne 4 @ : ligne 4 @ : ligne 4 @ : ligne 5 @ : ligne 5 @ : ligne g @ : ligne 5 @ : ligne 6, 7 @ : ligne i
fibo fibo fibo fibo fibo fibo
11:3 fi:? n : 3 fi : ? n : 3 fi : ? 11:3 fi:?
fibo fibo fibo £^ fibo
n: 3 fi: ? n: 3 fi :? n : 3 fi:? n: 3 fi: ? 11:3 fi:i n:3 fi:i
f a : ? f :? £2: ? f :? fa:? f : ? fa : ? f : ? f a : ? f :? fa : ? f : ? fa:? f:? fa :? f :? fa : ? f : ? fa : ? f : ?
@ : ligne 4 @ : ligne 4 @ : ligne 4 (!$ : ligne 4 @ : ligne 4 @ : ligne 4 @ : ligne 4 @ : ligne 4 @ : ligne 5 @ : ligne 5
main main main niai n main main main main main main
x:? x:? x:? x:? x: ? x:? x:? x:? x: ? x: ?
i L. B. Roimihanc; FSM.TN L. B. Romdliane; FSM.TN
-IViÉTHODES RECURSWËS (7) DE RECURSIVITË (1)
• On distingue les types de récursivité suivants
• Linéaire
fibo C • une méthode s'auto-appelle une seule fois
n:i fi:? • factoriel, puissance
fz:? f i
• Binaire
@ : ligne 2,7
fibo fibo • une méthode s'auto-appelle une seule fois
M3 (^
n: 3 fi : i n:3 fi: i • fibonacci
fa:? f:? fa:i f:a
• Multiple
@ : ligne 5 @ : ligne 6, 7
main main mam < • une méthode s'auto-appelle plus que deux fois
x :? x: ? x:.
L. B. Romdhane; ESM.TN © L. B. Romdhane; FSM.TN
5. "TYPES DE RECURSIVITE (2) DE LA RECURSIVITE (1)
Factoriel (n) Puissance (x, n) A L'exécution d'une méthode récursive peut êtPe
fonction factoriel(n : entier) : ~Joncnôn pulssahcefx: réel, n : entier) : modélisée à l'aide d'un arbre
réel
entier VAR r : r é e l • un ensemble de nœuds; et de liens (parent / fils)
VAR f : entier Début • et une racine
ïi (n=o) alors r «— i
Début i'inon
MOD 2.) -o alors
• Utilité ?
si (n=o) alors f f- o
*— pul6fiance(Xj n DIV z)
sinon f <-- n * factoriel (n-i) <— r * r 1. une meilleure compréhension du déroulement
fin Si pulsuncefo (n -0 DIV 2) 2. un outil formel pour analyser le coût d'exécution
retourner (f ) - K *r *r
fin Si d'une méthode récursive
Fin. fin Si
retourner (r)
lin.
10 L. U. Kuimiliiuic; KSM.1N © L. B. Romdhane; FSM.TN
DE LA RECURSIVITE (3)
A chaque nœud de l'arbre, on représente l'ensemble
des paramètres de l'appel récursif, la taille du problème,
etc.
La racine est constitué du premier appel à la méthode
Chaque appel récursif est représenté dans un nœud fils
du nœud où l'appel a été engendré
Les nœuds terminaux (ou feuilles) n'engendrent aucun
appel récursif
• Ils représentent les cas de base (où la taille du problème
est inférieur au seuil critique)
© L. B. Romdhane; (SM.TN C L, B. Romdhime; FSM.TN
ASD
6. "ARBRE DE LA REÇURSIVITE (4) ARBRE DE LA RECURSIVITE (5)
• Une fois construit, cet arbre fournit un outil
mathématique pour analyser le coût d'exécution d'une • coût: nombre fibo (3) 13]
méthode récursive d'opérations d'ajjlftkm &
• Calculer le coût à chaque appel; puis sommer sur tous d'affectation
les nœuds de l'arbre • coût total = 9
fibo-U) j3 j fibo (i) j
• coût total est fonction • Quel serait le coût pour
• du nombre de nœuds (nombre d'appels) fibo (n) d'une manière
• Le coût à chaque nœud (appel) générale ?
2 >
O !.. H. K dhane; KSM.TM G L. B. Romdhane; FSM.TN
"DISCUSSION -TERMINAISON
• Une méthode récursive finit-elle toujours par s'arrêter L'exactitude d'une méthode récursive est faite
lorsqu'elle est exécutée sur un jeu de données bien généralement par induction ^ -~ —""•-
déterminée ? Soit P(n) une proposition dont on veut démontrer
» Un problème non-décidable ! l'exactitude
8 Aucune preuve formelle Démontrer que P(n) est vraie Vne W] où 14/estun
• Généralement, on fait appel au « bon sens » ensemble de cas de base connus
• vérifier que la taille du sous-problème est inférieur à la Exprimer P(n) en fonction de P(n), ..,, P(nk); où n ( < n
taille du problème original avant l'appel récursif Supposer que P(n),..., P(nk); sont vraies; et
> vérifier les conditions d'exécution avant de lancer l'appel Démontrer que P(n) est vraie
récursif
O L. B. Rimidhane; VSM.TN © L. B. Roindhane; FSM.TN