Fonctions et récursivité STS SIO

Documents pareils
Algorithmes récursifs

Cours d algorithmique pour la classe de 2nde

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Représentation d un entier en base b

Cours 1 : Qu est-ce que la programmation?

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Chap 4: Analyse syntaxique. Prof. M.D. RAHMANI Compilation SMI- S5 2013/14 1

Initiation à l algorithmique

Licence Sciences et Technologies Examen janvier 2010


STAGE IREM 0- Premiers pas en Python

Cours Informatique Master STEP

Programmation linéaire

Objectifs du cours d aujourd hui. Informatique II : Cours d introduction à l informatique et à la programmation objet. Complexité d un problème (2)

L informatique en BCPST

Chapitre 2. Eléments pour comprendre un énoncé

Déroulement. Evaluation. Préambule. Définition. Définition. Algorithmes et structures de données 28/09/2009

Alarme domestique- Présentation

Génie Logiciel avec Ada. 4 février 2013

Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

Rappels sur les suites - Algorithme

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Baccalauréat ES Polynésie (spécialité) 10 septembre 2014 Corrigé

= constante et cette constante est a.

Architecture des ordinateurs

Probabilités. Rappel : trois exemples. Exemple 2 : On dispose d un dé truqué. On sait que : p(1) = p(2) =1/6 ; p(3) = 1/3 p(4) = p(5) =1/12

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

I00 Éléments d architecture

Bac Blanc Terminale ES - Février 2011 Épreuve de Mathématiques (durée 3 heures)

Rappel sur les bases de données

Programmation avec Xcas ou Python

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Université du Québec à Chicoutimi. Département d informatique et de mathématique. Plan de cours. Titre : Élément de programmation.

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

1 Recherche en table par balayage

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Informatique Générale

Initiation à la programmation en Python

Initiation à la Programmation en Logique avec SISCtus Prolog

Propagation sur réseau statique et dynamique

TP 1. Prise en main du langage Python

Cours d Algorithmique et de Langage C v 3.0

4. Les structures de données statiques

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Algorithmique et Programmation, IMA

La persistance des nombres

Introduction à MATLAB R

BACCALAURÉAT GÉNÉRAL SESSION 2012 OBLIGATOIRE MATHÉMATIQUES. Série S. Durée de l épreuve : 4 heures Coefficient : 7 ENSEIGNEMENT OBLIGATOIRE

La fonction exponentielle

1 Définition et Appel d une fonction. V. Phan Luong. Cours 4 : Fonctions

INTRODUCTION A L ELECTRONIQUE NUMERIQUE ECHANTILLONNAGE ET QUANTIFICATION I. ARCHITECTURE DE L ELECRONIQUE NUMERIQUE

OPTION SCIENCES BELLE-ISLE-EN-TERRE

Université Paris-Dauphine DUMI2E 1ère année, Applications

Corrigé des TD 1 à 5

Conventions d écriture et outils de mise au point

MIS 102 Initiation à l Informatique

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

TSTI 2D CH X : Exemples de lois à densité 1

Les métiers de l informatique. à la direction générale des Finances publiques

Introduction à l algorithmique et à la programmation (Info 2)

Approche Contract First

La NP-complétude. Johanne Cohen. PRISM/CNRS, Versailles, France.

Algorithme. Table des matières

Évaluation et implémentation des langages

Cours 7 : Utilisation de modules sous python

Problèmes liés à la concurrence

Calcul Formel et Numérique, Partie I

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

NIMEGUE V3. Fiche technique 3.07 : Sauvegarde / Restauration manuelle

Systèmes de transmission

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Chap III : Les tableaux

Synthèse «Le Plus Grand Produit»

Factorisation Factoriser en utilisant un facteur commun Fiche méthode

Logiciel Libre Cours 3 Fondements: Génie Logiciel

Quelques algorithmes simples dont l analyse n est pas si simple

Indications pour une progression au CM1 et au CM2

Probabilités. Une urne contient 3 billes vertes et 5 billes rouges toutes indiscernables au toucher.

Loi binomiale Lois normales

Algorithmique avec Algobox

Aide - mémoire gnuplot 4.0

Éditorial. Tangente ÉDUCATION. Scratch, AlgoBox, Python. Trimestriel - n 15 - janvier 2011 Numéro spécial 16 activités TICE pour le lycée

Corps des nombres complexes, J Paul Tsasa

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

EXPLOITATIONS PEDAGOGIQUES DU TABLEUR EN STG

ALGORITHMIQUE II NOTION DE COMPLEXITE. SMI AlgoII

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Définition : On obtient les nombres entiers en ajoutant ou retranchant des unités à zéro.

Baccalauréat L spécialité, Métropole et Réunion, 19 juin 2009 Corrigé.

Seconde Généralités sur les fonctions Exercices. Notion de fonction.

Gé nié Logiciél Livré Blanc

Exercices - Polynômes : corrigé. Opérations sur les polynômes

Informatique et sciences du numérique

Le chiffre est le signe, le nombre est la valeur.

MATLAB : COMMANDES DE BASE. Note : lorsqu applicable, l équivalent en langage C est indiqué entre les délimiteurs /* */.

Transcription:

Fonctions et récursivité STS SIO Alex Esbelin (Alex.Esbelin@math.univ-bpclermont.fr) Malika More (malika.more@u-clermont1.fr) IREM Clermont-Ferrand Stage du 29 Juin 2011

Contenu 1 Fonctions 2 Récursivité Introduction Définition Premiers exemples 3 Une structure de données liée à la récursivité Notion de pile Récursivité et pile de programme 4 Récursivité terminale 5 Conclusion

1 Fonctions 2 Récursivité 3 Une structure de données liée à la récursivité 4 Récursivité terminale 5 Conclusion

Introduction Fonction Saut3Lignes() début Aller à la ligne Aller à la ligne Aller à la ligne fin Éviter les redondances Isoler une séquence d instructions dans une fonction Remplacer ses occurrences par des appels à la fonction Améliorer la clarté des algorithmes Pas besoin de connaître l intérieur de la fonction Permettre la modularité J écris une fonction aujourd hui, une autre demain J écris une fonction et toi une autre

Paramètres d entrée Fonction SautLignes(n : entier) début pour i de 1 à n faire Aller à la ligne fin fin Permettre quelques variations SautLignes(3) SautLignes(8) Un paramètre peut être une variable Donner à p la valeur 5 SautLignes(p) Le nom de la variable et le nom du paramètre sont différents

Valeur(s) retournée(s) Fonction Euclide(a,b : entiers) début Donner à x la valeur a Donner à y la valeur b tant que y > 0 faire Donner à temp la valeur y Donner à y la valeur x mod y Donner à x la valeur temp fin retourner : x fin L expression obtenue peut être Assignée : Donner à n la valeur Euclide(8,13) Affichée : Afficher(Euclide(8,13)) Etc.

Quelques points subtils À propos des variables Variable locale : définie à l intérieur d une fonction, le programme principal et les autres fonctions ne la connaissent pas Il est préconisé de déclarer les variables locales et leur type sur papier Pas de déclaration en Python (ça dépend du langage) Variable globale : utilisée par le programme principal, à l intérieur de la fonction on peut la lire, mais pas la modifier Sauf si elle est déclarée globale à l intérieur de la fonction (en Python) Sauf si elle est d un type "liste" (en Python)

Quelques points subtils À propos des paramètres Passage par valeur : valeur du paramètre recopiée dans une nouvelle variable pour être utilisée dans la fonction Consomme de la mémoire supplémentaire La valeur du paramètre à l extérieur ne peut pas être modifiée par la fonction Passage par référence : le paramètre lui-même est directement utilisé dans la fonction Ne consomme pas de mémoire supplémentaire La valeur du paramètre peut être modifiée par la fonction En Python, tous les paramètres sont passés par référence (pour la gestion de la mémoire) mais les types simples sont "immutables" (ne peuvent pas être modifiés par la fonction)

1 Fonctions 2 Récursivité 3 Une structure de données liée à la récursivité 4 Récursivité terminale 5 Conclusion

Introduction Commençons par un petit exercice de maths. On considère la suite (u n ) définie pour n N par : { u0 = 1 u n+1 = 2 u n + 3 Sans utiliser l expression de u n en fonction de n, on se propose d écrire un algorithme qui pour un entier n donné, retourne la valeur de u n.

Introduction Ce que nous avons vu ce matin nous conduit à écrire : Fonction Uit(n : entier) Entrée : un entier n Résultat : La valeur du terme u n de la suite définie par : u 0 = 1 et u n+1 = 2 u n + 3 début Donner à Utmp la valeur 1 pour k de 1 à n faire Donner à Utmp la valeur 2 Utmp + 3 fin Retourner Utmp fin

Introduction Remarque On «monte» successivement les calculs des termes de la suite à partir de u 0 jusqu à u n. u 0 = 1, u 1 = 2 u 0 + 3 = 2 1 + 3 = 5 etc... On fera référence à cet algorithme, sous le qualificatif de version itérative.

Introduction On peut aussi envisager de réaliser les calculs dans le sens contraire, ce qui donne : u n = 2 (2 (... (2 u 0 + 3)...) + 3) + 3 }{{} n groupes de parenthèses On peut noter que cet ordre n est pas le plus pratique pour mener les calculs, mais il est tout à fait concevable. Nous allons voir dans la suite que cette façon de procéder est prévue dans l algorithmique et peut apporter un grand confort dans certains cas.

Introduction On peut aussi envisager de réaliser les calculs dans le sens contraire, ce qui donne : u n = 2 (2 (... (2 u 0 + 3)...) + 3) + 3 }{{} n groupes de parenthèses On peut noter que cet ordre n est pas le plus pratique pour mener les calculs, mais il est tout à fait concevable. Nous allons voir dans la suite que cette façon de procéder est prévue dans l algorithmique et peut apporter un grand confort dans certains cas.

Définition Définition On dit d une fonction qu elle est récursive lorsqu elle fait appel à elle-même. Remarque Le lien avec la récurrence en mathématiques n est pas le fruit du hasard.

Premiers exemples Revenons, à notre exemple : l écriture u n = 2 (2 (... (2 u 0 + 3)...) + 3) + 3 fait apparaitre un appel récursif à la séquence 2... + 3 u n est égal à 2 u n 1 + 3 avec u n 1 lui-même égal à 2 u n 2 + 3... la «descente» s arrête avec la valeur de u 0 (égale à 1 ici).

Premiers exemples Revenons, à notre exemple : l écriture u n = 2 (2 (... (2 u 0 + 3)...) + 3) + 3 fait apparaitre un appel récursif à la séquence 2... + 3 u n est égal à 2 u n 1 + 3 avec u n 1 lui-même égal à 2 u n 2 + 3... la «descente» s arrête avec la valeur de u 0 (égale à 1 ici).

Premiers exemples L écriture de l algorithme récursif donne : Fonction Urec(n : entier) Entrée : un entier n Résultat : La valeur du terme u n de la suite définie par : u 0 = 1 et u n+1 = 2 u n + 3 début si n = 0 alors retourner la valeur 1 % On traite le cas trivial correspondant au premier terme de la suite % sinon retourner la valeur 2 Urec(n 1) + 3 % ici, n 0 donc on retourne 2 la valeur du terme précédent +3 % fin fin

Premiers exemples Remarques Le test n = 0 est essentiel puisqu il assure l arrêt des appels récursifs. par sécurité, il peut-être remplacé par n 0 De plus l appel suivant se fait avec une valeur strictement inférieure à la valeur courante du paramètre. assure la terminaison de l algorithme.

Premiers exemples Remarques Le test n = 0 est essentiel puisqu il assure l arrêt des appels récursifs. par sécurité, il peut-être remplacé par n 0 De plus l appel suivant se fait avec une valeur strictement inférieure à la valeur courante du paramètre. assure la terminaison de l algorithme.

Premiers exemples L écriture de l algorithme sous sa version itérative a nécessité un travail de réflexion plus conséquent. Mise en place d une boucle, gestion du compteur de boucle, gestion d un résultat intermédiaire etc... La version récursive, elle, se trouve être la simple traduction de la définition mathématique de notre suite. Dans toutes les situations, où la récurrence entre en jeu, les algorithmes récursifs vont procurer des avantages non négligeables dans leur écriture.

Premiers exemples L écriture de l algorithme sous sa version itérative a nécessité un travail de réflexion plus conséquent. Mise en place d une boucle, gestion du compteur de boucle, gestion d un résultat intermédiaire etc... La version récursive, elle, se trouve être la simple traduction de la définition mathématique de notre suite. Dans toutes les situations, où la récurrence entre en jeu, les algorithmes récursifs vont procurer des avantages non négligeables dans leur écriture.

Premiers exemples L écriture de l algorithme sous sa version itérative a nécessité un travail de réflexion plus conséquent. Mise en place d une boucle, gestion du compteur de boucle, gestion d un résultat intermédiaire etc... La version récursive, elle, se trouve être la simple traduction de la définition mathématique de notre suite. Dans toutes les situations, où la récurrence entre en jeu, les algorithmes récursifs vont procurer des avantages non négligeables dans leur écriture.

Premiers exemples Le calcul de la factorielle sous forme itérative donne : Fonction Facto(n : entier) Entrée : un entier n Résultat : Factorielle de n début Donner à Utmp la valeur 1 pour k de 1 à n faire Donner à Utmp la valeur k Utmp fin Retourner Utmp fin Question : Ecrire un algorithme récursif du calcul de n! pour n donné, puis traduire cet algorithme sous Python.

Premiers exemples Le calcul de la factorielle sous forme itérative donne : Fonction Facto(n : entier) Entrée : un entier n Résultat : Factorielle de n début Donner à Utmp la valeur 1 pour k de 1 à n faire Donner à Utmp la valeur k Utmp fin Retourner Utmp fin Question : Ecrire un algorithme récursif du calcul de n! pour n donné, puis traduire cet algorithme sous Python.

Premiers exemples A travers les exemples précédents, on a pu constater qu il est impératif : que l appel récursif porte sur une valeur de paramètre inférieure à la valeur du paramètre précédent qu un test de sortie soit réalisé sur une valeur précise du paramètre. Ces points sont essentiels pour assurer la terminaison de l algorithme récursif. La preuve de correction, elle, est une preuve par récurrence. Question : qu en est-il de l efficacité de ces algorithmes?

Premiers exemples A travers les exemples précédents, on a pu constater qu il est impératif : que l appel récursif porte sur une valeur de paramètre inférieure à la valeur du paramètre précédent qu un test de sortie soit réalisé sur une valeur précise du paramètre. Ces points sont essentiels pour assurer la terminaison de l algorithme récursif. La preuve de correction, elle, est une preuve par récurrence. Question : qu en est-il de l efficacité de ces algorithmes?

Premiers exemples A travers les exemples précédents, on a pu constater qu il est impératif : que l appel récursif porte sur une valeur de paramètre inférieure à la valeur du paramètre précédent qu un test de sortie soit réalisé sur une valeur précise du paramètre. Ces points sont essentiels pour assurer la terminaison de l algorithme récursif. La preuve de correction, elle, est une preuve par récurrence. Question : qu en est-il de l efficacité de ces algorithmes?

Premiers exemples Un autre exemple : suite de Fibonacci Considérons la suite de Fibonacci, dont on rappelle la définition ci-dessous : { F0 = F 1 = 1 F n = F n 1 + F n 2 pour n 2

Premiers exemples Algorithmes itératif et récursif On sait maintenant écrire deux algorithmes différents : Fonction Fib(n) % version itérative début si n < 2 alors retourner : 1 sinon Donner à x la valeur 1 Donner à y la valeur 1 for i de 2 à n do Donner à temp la valeur x + y Donner à x la valeur y Donner à y la valeur temp end retourner : y fin fin Fonction Fib(n) % version récursive début si n < 2 alors retourner : 1 fin retourner : Fib(n 1)+Fib(n 2) fin

Premiers exemples Quelques temps de calculs Itératif Récursif n T(n) 0 0.0e-05 2 2.0e-05 4 3.0e-05 6 4.2e-05 8 5.2e-05 10 7.0e-05 12 7.8e-05 14 8.5e-05 16 1.0e-04 18 1.1e-04 20 1.2e-04 n T(n) 0 0.0e-05 2 2.0e-05 4 6.0e-05 6 1.7e-04 8 4.6e-04 10 1.2e-03 12 3.2e-03 14 9.0e-03 16 2.3e-02 18 6.0e-02 20 1.6e-01 T T n n

Premiers exemples Quelques temps de calculs Le constat est sans appel : l algorithme itératif sort gagnant du duel. Par exemple : le calcul de F 20 nécessite 1.6e-01 s en version récursive contre 1.2e-04 s en version itérative, soit 1300 fois plus! Au dela de cet aspect, les courbes de temps de ces deux versions contrastent énormément : La version itérative révèle une courbe T qui semble proportionnelle au temps. La version récursive révèle une courbe T présentant une croissance qui semble exponentielle. Le calcul de F 40, par exemple, peut même se révéler plus rapide à la main.

Premiers exemples Quelques temps de calculs Le constat est sans appel : l algorithme itératif sort gagnant du duel. Par exemple : le calcul de F 20 nécessite 1.6e-01 s en version récursive contre 1.2e-04 s en version itérative, soit 1300 fois plus! Au dela de cet aspect, les courbes de temps de ces deux versions contrastent énormément : La version itérative révèle une courbe T qui semble proportionnelle au temps. La version récursive révèle une courbe T présentant une croissance qui semble exponentielle. Le calcul de F 40, par exemple, peut même se révéler plus rapide à la main.

1 Fonctions 2 Récursivité 3 Une structure de données liée à la récursivité 4 Récursivité terminale 5 Conclusion

Notion de pile Une pile est une structure de donnée est dite de type LIFO 1 : La dernière valeur entrée dans la pile est la première sortie, c est-à-dire accessible. Pour se représenter cette structure, il est intéressant de faire l analogie avec une pile d assiettes. 1. Last In First Out

Notion de pile Une pile est une structure de donnée est dite de type LIFO 1 : La dernière valeur entrée dans la pile est la première sortie, c est-à-dire accessible. Pour se représenter cette structure, il est intéressant de faire l analogie avec une pile d assiettes. 1. Last In First Out

Notion de pile Un exemple Objectif Présentation On dispose d une pile d assiettes. Cette pile se compose d assiettes bleues en dehors d une assiette qui est rouge. Ecrire un algorithme, permettant de récupérer cette assiette rouge, afin de n avoir plus que des assiettes bleues.

Notion de pile Un exemple Objectif Présentation On dispose d une pile d assiettes. Cette pile se compose d assiettes bleues en dehors d une assiette qui est rouge. Ecrire un algorithme, permettant de récupérer cette assiette rouge, afin de n avoir plus que des assiettes bleues.

Notion de pile Pour cela, nous supposerons avoir à notre disposition, les fonctions suivantes : empiler(p,a) ajoute l élément a au sommet de la pile P et restitue la pile P ainsi modifiée. depiler(p,a) enlève l élément supérieur de la pile P, restitue cet élément dans a et restitue la pile P sans cet élément.

Notion de pile En pratique L assiette, du sommet de la pile, est bleue : on l enlève et on la place sur la pile voisine.

Notion de pile En pratique L assiette, du sommet de la pile, est bleue : on l enlève et on la place sur la pile voisine.

Notion de pile En pratique L assiette, du sommet de la pile, est bleue : on l enlève et on la place sur la pile voisine.

Notion de pile En pratique L assiette, du sommet de la pile, est bleue : on l enlève et on la place sur la pile voisine.

Notion de pile En pratique L assiette, du sommet de la pile, est bleue : on l enlève et on la place sur la pile voisine.

Notion de pile En pratique L assiette, du sommet de la pile, est bleue : on l enlève et on la place sur la pile voisine.

Notion de pile En pratique L assiette, du sommet de la pile, est bleue : on l enlève et on la place sur la pile voisine.

Notion de pile En pratique L assiette, du sommet de la pile, est bleue : on l enlève et on la place sur la pile voisine.

Notion de pile En pratique L assiette, du sommet de la pile, est rouge.

Notion de pile En pratique On la récupère.

Notion de pile En pratique Et on reconstruit notre pile.

Notion de pile En pratique Et on reconstruit notre pile.

Notion de pile En pratique Et on reconstruit notre pile.

Notion de pile En pratique Et on reconstruit notre pile.

Notion de pile En pratique Et on reconstruit notre pile.

Notion de pile En pratique Et on reconstruit notre pile.

Notion de pile En pratique Et on reconstruit notre pile.

Notion de pile En pratique Et on reconstruit notre pile.

Notion de pile En pratique C est terminé : on a enlevé notre assiette de la pile.

Notion de pile Algorithme Algorithme 10 : exemple d une gestion de pile Entrée : début Q est une pile vide tant que P n est pas vide faire Depiler(P,a) si a est différent de rouge alors Empiler(Q,a) fin fin tant que Q n est pas vide faire Depiler(Q,b) Empiler(P,b) fin fin L algorithme, ci-contre, reçoit une pile P et la retourne débarassée des valeurs rouges. Remarque L algorithme utilise une pile auxiliaire Q permettant la reconstruction de la pile P et la restitution de ses données dans l ordre initial.

Notion de pile Algorithme Algorithme 11 : exemple d une gestion de pile Entrée : début Q est une pile vide tant que P n est pas vide faire Depiler(P,a) si a est différent de rouge alors Empiler(Q,a) fin fin tant que Q n est pas vide faire Depiler(Q,b) Empiler(P,b) fin fin L algorithme, ci-contre, reçoit une pile P et la retourne débarassée des valeurs rouges. Remarque L algorithme utilise une pile auxiliaire Q permettant la reconstruction de la pile P et la restitution de ses données dans l ordre initial.

Récursivité et pile de programme De façon (très) simplifiée : L exécution d un programme peut être représentée comme le parcours d un chemin ayant une origine et une extrémité. L appel d une procédure ( ou d une fonction) se caractérise alors par un circuit 2. Le processeur a alors besoin de stocker différentes informations (adresses mémoires, variables, paramètres etc...). Remarque Pour réaliser tout cela, le processeur gère une ou plusieurs piles dans lesquelles il stocke les adresses de retour des procédures et les valeurs des différentes variables. On appellera ces données contexte de la procédure. 2. chemin dont l origine et l extrémité sont confondues

Récursivité et pile de programme De façon (très) simplifiée : L exécution d un programme peut être représentée comme le parcours d un chemin ayant une origine et une extrémité. L appel d une procédure ( ou d une fonction) se caractérise alors par un circuit 2. Le processeur a alors besoin de stocker différentes informations (adresses mémoires, variables, paramètres etc...). Remarque Pour réaliser tout cela, le processeur gère une ou plusieurs piles dans lesquelles il stocke les adresses de retour des procédures et les valeurs des différentes variables. On appellera ces données contexte de la procédure. 2. chemin dont l origine et l extrémité sont confondues

Récursivité et pile de programme De façon (très) simplifiée : L exécution d un programme peut être représentée comme le parcours d un chemin ayant une origine et une extrémité. L appel d une procédure ( ou d une fonction) se caractérise alors par un circuit 2. Le processeur a alors besoin de stocker différentes informations (adresses mémoires, variables, paramètres etc...). Remarque Pour réaliser tout cela, le processeur gère une ou plusieurs piles dans lesquelles il stocke les adresses de retour des procédures et les valeurs des différentes variables. On appellera ces données contexte de la procédure. 2. chemin dont l origine et l extrémité sont confondues

Récursivité et pile de programme De façon (très) simplifiée : L exécution d un programme peut être représentée comme le parcours d un chemin ayant une origine et une extrémité. L appel d une procédure ( ou d une fonction) se caractérise alors par un circuit 2. Le processeur a alors besoin de stocker différentes informations (adresses mémoires, variables, paramètres etc...). Remarque Pour réaliser tout cela, le processeur gère une ou plusieurs piles dans lesquelles il stocke les adresses de retour des procédures et les valeurs des différentes variables. On appellera ces données contexte de la procédure. 2. chemin dont l origine et l extrémité sont confondues

Récursivité et pile de programme 1er appel de la fonction paramètre n 2nd appel de la fonction paramètre n 1... dernier appel de la fonction paramètre n = 0 appel fonction récursive ligne principale du programme contexte n + 1 contexte 2 contexte 1 A l appel de la fonction récursive, le programme crée une pile

Récursivité et pile de programme 1er appel de la fonction paramètre n 2nd appel de la fonction paramètre n 1... dernier appel de la fonction paramètre n = 0 appel fonction récursive ligne principale du programme contexte n + 1 contexte 2 contexte 1 le programme sauvegarde le premier contexte

Récursivité et pile de programme 1er appel de la fonction paramètre n 2nd appel de la fonction paramètre n 1... dernier appel de la fonction paramètre n = 0 appel fonction récursive ligne principale du programme contexte n + 1 contexte 2 contexte 1 le programme sauvegarde le second contexte

Récursivité et pile de programme 1er appel de la fonction paramètre n 2nd appel de la fonction paramètre n 1... dernier appel de la fonction paramètre n = 0 appel fonction récursive ligne principale du programme contexte n + 1 contexte 2 contexte 1 le programme empile les contextes successifs, avec passage des paramètres

Récursivité et pile de programme 1er appel de la fonction paramètre n 2nd appel de la fonction paramètre n 1... dernier appel de la fonction paramètre n = 0 appel fonction récursive ligne principale du programme contexte n + 1 contexte 2 contexte 1 le programme sauvegarde le dernier contexte

Récursivité et pile de programme 1er appel de la fonction paramètre n 2nd appel de la fonction paramètre n 1... dernier appel de la fonction paramètre n = 0 appel fonction récursive ligne principale du programme contexte n + 1 contexte 2 contexte 1 le programme dépile les contextes avec passage des résultats

Récursivité et pile de programme 1er appel de la fonction paramètre n 2nd appel de la fonction paramètre n 1... dernier appel de la fonction paramètre n = 0 appel fonction récursive ligne principale du programme contexte n + 1 contexte 2 contexte 1 le programme dépile le contexte 2 et retourne à l appel 1

Récursivité et pile de programme 1er appel de la fonction paramètre n 2nd appel de la fonction paramètre n 1... dernier appel de la fonction paramètre n = 0 appel fonction récursive ligne principale du programme contexte n + 1 contexte 2 contexte 1 le programme dépile le contexte 1 et retourne à l appel initial avec le résultat final

Récursivité et pile de programme 1er appel de la fonction paramètre n 2nd appel de la fonction paramètre n 1... dernier appel de la fonction paramètre n = 0 appel fonction récursive ligne principale du programme contexte n + 1 contexte 2 contexte 1 le programme poursuit son exécution

Récursivité et pile de programme Retour à la site de Fibonacci Dans notre algorithme récursif de Fibonacci, de nombreux appels récursifs sont redondants, comme l illustre le schéma ci-dessous : calcul de F n 2 calcul de F n 1 calcul de F n 3 calcul de F n calcul de F n 3 calcul de F n 2 calcul de F n 4

Récursivité et pile de programme Un tel arbre donne un nombre de chemins de l ordre de 2 n. Par exemple, 2 50 appels récursifs, nécessitent une pile d au moins 10 15 données. pour information, 1To 10 12 octets. Remarque La traduction de cet algorithme va ainsi générer de gros problèmes de temps de calcul et de mémoire, comme on l a vu.

Récursivité et pile de programme Un tel arbre donne un nombre de chemins de l ordre de 2 n. Par exemple, 2 50 appels récursifs, nécessitent une pile d au moins 10 15 données. pour information, 1To 10 12 octets. Remarque La traduction de cet algorithme va ainsi générer de gros problèmes de temps de calcul et de mémoire, comme on l a vu.

1 Fonctions 2 Récursivité 3 Une structure de données liée à la récursivité 4 Récursivité terminale 5 Conclusion

Euclide récursif Fonction EuclideRec(a, b) début si b == 0 alors retourner : a fin Donner à c la valeur a mod b retourner : EuclideRec(b, c) fin Cet algorihme est basé sur la propriété : pgcd(a, b) = pgcd(b, a mod b) L appel récursif est la dernière instruction de la fonction : on parle de récursivité terminale

Factorielle terminale Fonction FactoTerm(n, acc) début si n <= 1 alors retourner : acc fin retourner : FactoTerm(n 1, n acc) fin On appelle FactoTerm(n, 1) On voit ici l utilisation d une variable auxiliaire acc qui joue le rôle d accumulateur des calculs intermédiaires

Encore un accumulateur Fonction UTerm(n, acc) début si n <= 0 alors retourner : acc fin retourner : UTerm(n 1, 2 acc + 3) fin On appelle UTerm(n, 1) Tous les algorithmes récursifs peuvent être réécrits (plus ou moins facilement) sous une forme terminale Exercice : Écrire la fonction FiboTerm(n, avtder, der)

À quoi ça sert? À écrire du code plus efficace Un algorithme récursif est facile à écrire mais souvent peu efficace à l exécution Un algorithme itératif est plus difficile à écrire mais souvent plus efficace à l exécution Une récursion terminale est facile à dérécusiver Certains compilateurs sont capables de détecter et de dérécursiver automatiquement les récursions terminales

Dérécursiver Fonction FRec(param) début si arret(param) alors retourner : finir(param) fin Traiter(param) retourner : FRec(changer(param)) fin Fonction FIter(param) début tant que non (arret(param)) faire Traiter(param) Donner à param la valeur changer(param) fin retourner : finir(param) fin

Dérécursiver Fonction FRec(param) début si arret(param) alors retourner : finir(param) fin Traiter(param) retourner : FRec(changer(param)) fin Fonction FIter(param) début tant que non (arret(param)) faire Traiter(param) Donner à param la valeur changer(param) fin retourner : finir(param) fin

1 Fonctions 2 Récursivité 3 Une structure de données liée à la récursivité 4 Récursivité terminale 5 Conclusion

La récursivité est indispensable en algorithmique : traduction de la récurrence en mathématiques écritures simples des algorithmes solutions simples de problèmes complexes permet la mise en œuvre de méthodes très puissantes On fera attention : aux conditions de terminaison à la gestion de la taille de la pile d exécution à certains problèmes de complexités à surveiller à l efficacité parfois moindre qu une version itérative on peut toujours transformer l algorithme en version itérative (dérécursiver)

La récursivité est indispensable en algorithmique : traduction de la récurrence en mathématiques écritures simples des algorithmes solutions simples de problèmes complexes permet la mise en œuvre de méthodes très puissantes On fera attention : aux conditions de terminaison à la gestion de la taille de la pile d exécution à certains problèmes de complexités à surveiller à l efficacité parfois moindre qu une version itérative on peut toujours transformer l algorithme en version itérative (dérécursiver)

La récursivité est indispensable en algorithmique : traduction de la récurrence en mathématiques écritures simples des algorithmes solutions simples de problèmes complexes permet la mise en œuvre de méthodes très puissantes On fera attention : aux conditions de terminaison à la gestion de la taille de la pile d exécution à certains problèmes de complexités à surveiller à l efficacité parfois moindre qu une version itérative on peut toujours transformer l algorithme en version itérative (dérécursiver)

La récursivité est indispensable en algorithmique : traduction de la récurrence en mathématiques écritures simples des algorithmes solutions simples de problèmes complexes permet la mise en œuvre de méthodes très puissantes On fera attention : aux conditions de terminaison à la gestion de la taille de la pile d exécution à certains problèmes de complexités à surveiller à l efficacité parfois moindre qu une version itérative on peut toujours transformer l algorithme en version itérative (dérécursiver)

La récursivité est indispensable en algorithmique : traduction de la récurrence en mathématiques écritures simples des algorithmes solutions simples de problèmes complexes permet la mise en œuvre de méthodes très puissantes On fera attention : aux conditions de terminaison à la gestion de la taille de la pile d exécution à certains problèmes de complexités à surveiller à l efficacité parfois moindre qu une version itérative on peut toujours transformer l algorithme en version itérative (dérécursiver)

La récursivité est indispensable en algorithmique : traduction de la récurrence en mathématiques écritures simples des algorithmes solutions simples de problèmes complexes permet la mise en œuvre de méthodes très puissantes On fera attention : aux conditions de terminaison à la gestion de la taille de la pile d exécution à certains problèmes de complexités à surveiller à l efficacité parfois moindre qu une version itérative on peut toujours transformer l algorithme en version itérative (dérécursiver)

La récursivité est indispensable en algorithmique : traduction de la récurrence en mathématiques écritures simples des algorithmes solutions simples de problèmes complexes permet la mise en œuvre de méthodes très puissantes On fera attention : aux conditions de terminaison à la gestion de la taille de la pile d exécution à certains problèmes de complexités à surveiller à l efficacité parfois moindre qu une version itérative on peut toujours transformer l algorithme en version itérative (dérécursiver)

La récursivité est indispensable en algorithmique : traduction de la récurrence en mathématiques écritures simples des algorithmes solutions simples de problèmes complexes permet la mise en œuvre de méthodes très puissantes On fera attention : aux conditions de terminaison à la gestion de la taille de la pile d exécution à certains problèmes de complexités à surveiller à l efficacité parfois moindre qu une version itérative on peut toujours transformer l algorithme en version itérative (dérécursiver)

FIN