Dérécursivation Dérécursiver, c’est transformer un algorithme récursif en un algorithme équivalent ne contenant pas d’appels récursifs. Récursivité terminale.

Slides:



Advertisements
Présentations similaires
Chapitre annexe. Récursivité
Advertisements

Algorithmique (suite)
Portée des variables VBA & Excel
Fonctions & procédures
Structures de données et complexité
Sensibilisation à l’Algorithmique
Introduction à l’Algorithmique
Sensibilisation à l’Algorithmique et structure de données
Les Structures de contrôles itératives
Problème de 8 dames: Sachant que dans un jeu des échecs, une dame peut pendre toute pièce se trouvant sur la colonne ou sur la ligne ou sur les diagonales.
Applications sur les algorithmes récurrents avec Les Matrices
Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.
Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.
Cours d'algorithmique 8 - Intranet 1 4 décembre 2006 Cours dAlgorithmique Dérécursion (fin) : Équivalences entre programmes récursifs et programmes itératifs.
Cours d’Algorithmique
Les sous-programmes Chapitre n° 5: Objectifs : Activité:
Algorithmique -les fichiers-
Section VI Structures répétitives (suite)
Chapitre IV. Structures linéaires (piles, files, listes chaînées)
Principes de programmation (suite)
Références Bibliographiques
Cours 7 - Les pointeurs, l'allocation dynamique, les listes chaînées
Structures de données linéaires
Algo-Prog en Ada TD1 2 MIC Romaric GUILLERM
La structure conditionnelle simple
Récursivité.
Les structures de données arborescentes
II. Chaînage, SDD séquentielles
CSI3525: Concepts des Langages de Programmation Notes # 12: Implementation des Sous-Programmes ( Lire Chapitre 9 )
Introduction à la récursivité
La programmation objet Illustration de la POO en Pascal
Programmation fonctionnelle Le langage LISP
FICHIERS : Définition : Algorithme général:
Présentation Structures de Données et TDA

Efficacité des algorithmes
Partie II Sémantique.
IFT-2000: Structures de données Piles et files Dominic Genest, 2009.
Algorithmique et structures de données en C
Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009.
Plan cours La notion de pointeur et d’adresse mémoire.
Structures de données IFT-2000 Abder Alikacem La récursivité Département d’informatique et de génie logiciel Édition Septembre 2009.

Algorithmique Avancée II
RAPPEL Qu’est ce qu’une structure de contrôle itérative ?
Algo-Prog en Ada TD1 2 MIC Romaric GUILLERM
Programmation procédurale Les différents schémas
LES PILES ET FILES.
O-notation 1. Introduction 2. O-notation 3. Opérations 3.1 Somme 3.2 Produit 4. Règles générales 5. Exemple 6.Analyse des algorithmes récursifs 6.1 Dilatation.
Procédures et fonctions Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
1 Algorithmique et programmation en Itérations (boucles) Types numériques simples (suite)
Algorithmes de tri et de recherche
Programmation procédurale preuves D. Preuves Preuves sur les R-algorithmes. Règle de l'appel (Hoare). Exemple Preuves sur les B-algorithmes (Floyd) Automatisation.
Programmation linéaire en nombres entiers
Le langage Racket (Lisp)
ETNA – 1ème année Guillaume Belmas –
Méthodes et outils de conception Introduction à la programmation Paramètre de retour Appel d’une fonction Portée des variables Définition Pourquoi les.
ISBN Chapitre 10 L'implémentation des sous- programmes.
Les algorithmes recursifs
Introduction à la récursivité
2005/2006 Structures de Données Introduction à la complexité des algorithmes.
La récursivité Mireille Goud HEG Vd AlgSD - Résurisivité.
CPI/BTS 2 Algorithmique & Programmation La récursivité Algo – Prog CPI/BTS2 – M. Dravet – 14/09/2003 Dernière modification: 14/09/2003.
UE MAREP Cours 8 : La pile d’exécution (Fonctions imbriquées et fonctions récursives) Patricia Renault UPMC 2005/2006.
Module algorithmique et programmation
Algorithmique Boucles et Itérations
Introduction à l’Informatique chap 3 Licence SPI Mme Delmotte.
Chap. 3 Récursion et induction. Les définitions par récurrence consistent à construire des objets finis, à partir d'autres, selon certaines règles. Les.
Les Instructions Itératives (Les Boucles)
L ES I NSTRUCTIONS I TÉRATIVES (L ES B OUCLES ) Réalisé par : OUZEGGANE Redouane Département de Technologie Faculté de Technologie – Université A.Mira,
Transcription de la présentation:

Dérécursivation Dérécursiver, c’est transformer un algorithme récursif en un algorithme équivalent ne contenant pas d’appels récursifs. Récursivité terminale Définition Un algorithme est dit récursif terminal s’il ne contient aucun traitement après un appel récursif.

Récursivité terminale Exemple : ALGORITHME P(U) si C(U) alors D(U);P(a(U)) sinon T(U) où : – U est la liste des paramètres ; – C(U) est une condition portant sur U ; – D(U) est le traitement de base de l’algorithme (dépendant de U) ; – a(U) représente la transformation des paramètres ; – T(U) est le traitement de terminaison (dépendant de U).

Récursivité terminale Avec ces notations, l’algorithme P équivaut à l’algorithme suivant : ALGORITHME P’(U) tant que C(U) faire D(U);U  a(U) T(U) L’algorithme P’ est une version dérécursivée de l’algorithme P.

Récursivité non terminale Ici, pour pouvoir dérécursiver, il va falloir sauvegarder le contexte de l’appel récursif, typiquement les paramètres de l’appel engendrant l’appel récursif. Originellement, l’algorithme est : ALGORITHME Q(U) si C(U) alors D(U);Q(a(U));F(U) sinon T(U)

Récursivité non terminale Utilisation de piles Après dérécursivation on obtiendra donc : ALGORITHME Q’(U) empiler(nouvel_appel, U) tant que pile non vide faire dépiler(état, V) si état = nouvel_appel alors U  V si C(U) alors D(U) empiler(fin, U) empiler(nouvel_appel, a(U)) sinon T(U) si état = fin alors U  V F(U)

Illustration de la dérécursivation de l’algorithme Q Exemple d’exécution de Q : Appel Q(U0) C(U0) vrai D(U0) Appel Q(a(U0)) C(a(U0)) vrai D(a(U0)) Appel Q(a(a(U0))) C(a(a(U0))) faux T(a(a(U0))) F(a(U0)) F(U0)

Exemple d’exécution de l’algorithme dérécursivé. Appel Q’(U0) empiler(nouvel_appel, U)) pile = [(nouvel_appel, U0)] dépiler(état, V)) état  nouvel_appel ; V  U0 ; pile = [] U  U0 C(U0) vrai D(U0) empiler(fin, U)) pile = [(fin, U0)] empiler(nouvel_appel, a(U))) pile = [(fin, U0) ; (nouvel_appel, a(U0))]

Exemple d’exécution de l’algorithme dérécursivé. dépiler(état, V)) état  nouvel_appel ; V  a(U0) ; pile = [(fin, U0)] U  a(U0) C(a(U0)) vrai D(a(U0)) empiler(fin, U)) pile = [(fin, U0) ; (fin, a(U0))] empiler(nouvel_appel, a(U))) pile = [(fin, U0) ; (fin, a(U0)) ; (nouvel_appel, a(a(U0)))]

Exemple d’exécution de l’algorithme dérécursivé. dépiler(état, V)) état  nouvel_appel ; V  a(a(U0)) ; pile = [(fin, U0) ; (fin, a(U0))] U  a(a(U0)) C(a(a(U0))) faux T(a(a(U0))) état fin ; V  a(U0) ; pile = [(fin, U0)] F(a(U0)) état  fin ; V  U0 ; pile = [] F(U0)

Dérécursivation Remarques Les programmes itératifs sont souvent plus efficaces, mais les programmes récursifs sont plus faciles à écrire. Les compilateurs savent, la plupart du temps, reconnaître les appels récursifs terminaux, et ceux-ci n’engendrent pas de surcoût par rapport à la version itérative du même programme. Il est toujours possible de dérécursiver un algorithme récursif.

U = a, C(U) = a<>nil, D(U) = vide a(U) = a^.suivant, ALGORITHME Q(U) si C(U) alors D(U);Q(a(U));F(U) sinon T(U) Exemple 1 Procedure ParcoursListe(a U  :liste)  Debut si(a<>nil) C(U) alors begin Q(a(U)); ParcoursListe(a^.suivant) ; F(U) Ecrire(a^.info) End fsi fin U = a, C(U) = a<>nil, D(U) = vide a(U) = a^.suivant, F(U) = ecrire(a^.info), T(U)= vide

Procedure parcoursListe (a :Liste) var p: Liste etat : (nouvel_appel, fin) debut empiler(nouvel_appel, a) tant que pile non vide faire dépiler(état, p) si état = nouvel_appel alors a  p si a<>nil alors empiler(fin, a) empiler(nouvel_appel,a^.suivant) fisi fsi si état = fin alors a  p ecrire(a^.info) fsi  ftantque fin

U = a, C(U)= a<>nil, ALGORITHME P(U) si C(U) alors D(U);P(a(U)) sinon T(U) procedure parcoursInfixe(a :Arbre) debut si (a<>nil) parcoursInfixe(a^.fg) ecrire(a^.info) parcoursInfixe(a^.fd) fsi fin ALGORITHME P’(U) tant que C(U) faire D(U);U  a(U) T(U) U = a, C(U)= a<>nil, D(U) = {parcoursInfixe(a^.fg) , ecrire(a^.info)}, a(U)= a^.fd, T(U) = vide

Procedure ParcoursInfixe(a :Arbre) debut Tantque (a<>nil) faire ParcoursInfixe(a^.fg) Ecrire(a^.info) a  a^.fd fintantque fin ALGORITHME Q(U) si C(U) alors D(U);Q(a(U));F(U) sinon T(U) U = a , C(U) = a<>nil, D(U) = vide, a(U)=a^.fg, F(U) ={ecrire(a^.info), a=a^.fd} , T(U) =vide

Procedure parcoursInfixe(a :Arbre) empiler(nouvel_appel, a) tant que pile non vide faire dépiler(état, V) si état = nouvel_appel alors a  V si a<>nil alors empiler(fin, a) empiler(nouvel_appel, a^.fg) fsi si état = fin alors a  V ecrire(a^.info) aa^.fd fintantque

Autre forme de récurisivité non terminale Procédure Pi (U) début initPileVide tantque C(U) ou not pileVide faire tantque C(U) faire D(U) empiler(U) U:= a(U) fin tant que depiler (U) F(U) fin tantque fin Procédure Pr (U) début tantque C(U) faire D(U) Pr(a(U)) F(U) fin tantque fin