Thierry Lecroq. Université de Rouen FRANCE. university-logo. Thierry Lecroq (Univ. Rouen) Récursivité et TDA 1 / 48

Documents pareils
T. A. D. pile. Chapitre 7 (suite) Listes particulières. T. A. D. file. représentation chaînée de la file algorithmique. Files

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

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

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

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Les arbres binaires de recherche

Université Bordeaux 1, Licence Semestre 3 - Algorithmes et struct...

Bases de programmation. Cours 5. Structurer les données

Structure fonctionnelle d un SGBD

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)

PROJET ALGORITHMIQUE ET PROGRAMMATION II

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Algorithmique, Structures de données et langage C

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Architecture des ordinateurs

Initiation à l algorithmique

Cours d initiation à la programmation en C++ Johann Cuenin

Traduction des Langages : Le Compilateur Micro Java

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

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

Les structures de données. Rajae El Ouazzani

1 Recherche en table par balayage

Analyse de sécurité de logiciels système par typage statique


Introduction à la programmation concurrente

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Cours de Systèmes d Exploitation

Premiers Pas en Programmation Objet : les Classes et les Objets

STAGE IREM 0- Premiers pas en Python

Exercices INF5171 : série #3 (Automne 2012)

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Corrigé des TD 1 à 5

Conventions d écriture et outils de mise au point

Création d objet imbriqué sous PowerShell.

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Introduction à MATLAB R

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Rappel sur les bases de données

Poker. A rendre pour le 25 avril

Ensimag 1ère année Algorithmique 1 Examen 2ième session 24 juin Algorithmique 1

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

Ordonnancement temps réel

Processus! programme. DIMA, Systèmes Centralisés (Ph. Mauran) " Processus = suite d'actions = suite d'états obtenus = trace

TD2/TME2 : Ordonnanceur et Threads (POSIX et fair)

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

L exclusion mutuelle distribuée

Programme Compte bancaire (code)

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

UE Programmation Impérative Licence 2ème Année

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

Cours Informatique Master STEP

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

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

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

SUPPORT DE COURS. Dr. Omari Mohammed Maître de Conférences Classe A Université d Adrar Courriel : omarinmt@gmail.com

Problèmes liés à la concurrence

Chapitre VI- La validation de la composition.

Chapitre 5 : Flot maximal dans un graphe

Chapitre 2. Classes et objets

Initiation. àl algorithmique et à la programmation. en C

Cours 1 : Qu est-ce que la programmation?

IRL : Simulation distribuée pour les systèmes embarqués

Le langage C. Séance n 4

Algorithmes récursifs

Programmation avec des objets : Cours 7. Menu du jour

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

OS Réseaux et Programmation Système - C5

Exécutif temps réel Pierre-Yves Duval (cppm)

Compression de Données - Algorithme de Huffman Document de Conception

l ERP sans limite Multi Evolutif et modulaire Import-Export des informations

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Architecture des Systèmes d Information Architecture des Systèmes d Information

Informatique Générale

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

ET 24 : Modèle de comportement d un système Boucles de programmation avec Labview.

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Sommaire. Structure. Liste simplement chaînée ALGORITHME ET STRUCTURES DE DONNÉES II

Principes des langages de programmation INF 321. Eric Goubault

3. SPÉCIFICATIONS DU LOGICIEL. de l'expression des besoins à la conception. Spécifications fonctionnelles Analyse fonctionnelle et méthodes

Projet Active Object

TP1 : Initiation à Java et Eclipse

Durée estimée :1 journée Date de la réalisation : Description Fournisseur Référence Nombre PU HT LM35CZ, LM35AZ LM35DZ

Présentation du langage et premières fonctions

1 Lecture de fichiers

Systemes d'exploitation des ordinateurs

6. Hachage. Accès aux données d'une table avec un temps constant Utilisation d'une fonction pour le calcul d'adresses

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Solution A La Gestion Des Objets Java Pour Des Systèmes Embarqués

Mise en œuvre des serveurs d application

TD3: tableaux avancées, première classe et chaînes

Machines Virtuelles. et bazard autour. Rémi Forax

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

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Objets et Programmation. origine des langages orientés-objet

Programmation Orientée Objet

Transcription:

Récursivité et TDA Thierry Lecroq Université de Rouen FRANCE Thierry Lecroq (Univ. Rouen) Récursivité et TDA 1 / 48

Plan du cours 1 La récursivité 2 Les listes chaînées 3 Les types de données abstraits Thierry Lecroq (Univ. Rouen) Récursivité et TDA 2 / 48

Plan 1 La récursivité 2 Les listes chaînées 3 Les types de données abstraits Thierry Lecroq (Univ. Rouen) Récursivité et TDA 3 / 48

La récursivité Définition informelle Un objet est dit récursif s il est utilisé dans sa définition ou sa composition. Exemple Une poupée russe est une poupée qui contient une poupée russe. Thierry Lecroq (Univ. Rouen) Récursivité et TDA 4 / 48

La récursivité On peut utiliser la récursivité pour définir des objets mathématiques comme les entiers naturels. Exemple 0 est un entier naturel. Le successeur d un entier naturel est un entier naturel. Thierry Lecroq (Univ. Rouen) Récursivité et TDA 5 / 48

La récursivité Dans toute définition récursive doit apparaître une condition d arrêt. Exemple Une poupée russe est une poupée qui contient une poupée russe ou une poupée pleine. Thierry Lecroq (Univ. Rouen) Récursivité et TDA 6 / 48

Fonction récursive Une fonction est dite récursive si sa définition contient un appel à elle-même. La condition d arrêt permet alors d arrêter les appels récursifs empêchant ainsi le programme de s exécuter indéfiniment. La plupart des langages de programmation autorise l utilisation de sous-programmes récursifs. Thierry Lecroq (Univ. Rouen) Récursivité et TDA 7 / 48

Calcul de factorielle n! n! = 1 2 n 1 n = n i=1 i 0! = 1 Fonction itérative fonction factiter(n : entier) : entier auxiliaires i, f : entiers début f 1 i 0 {f = i!} tant que i < n faire {f = i! et i < n} i i + 1 {f = (i 1)! et i n} f f i {f = i! et i n} fin tant que {f = i! et i = n} retourner f fin university-logo Thierry Lecroq (Univ. Rouen) Récursivité et TDA 8 / 48

Calcul de factorielle Exemple i 0 1 2 3 4 5 f 1 1 2 6 24 120 Complexité La boucle tant que s exécute n fois, la complexité est donc de l ordre de n. Thierry Lecroq (Univ. Rouen) Récursivité et TDA 9 / 48

Calcul de factorielle 0! = 1 n! = n (n 1)! n > 0 Fonction récursive fonction factrec(n : entier) : entier début si n = 0 alors retourner 1 sinon retourner n factrec(n 1) fin si fin Thierry Lecroq (Univ. Rouen) Récursivité et TDA 10 / 48

Mémoire allouée à un processus Zone de code (instructions) Zone des données statiques Pile d exécution Tas (données dynamiques) Thierry Lecroq (Univ. Rouen) Récursivité et TDA 11 / 48

Calcul de factorielle Exemple Zone de code (instructions) Zone des données statiques factrec(n = 5) Tas (données dynamiques) Thierry Lecroq (Univ. Rouen) Récursivité et TDA 12 / 48

Calcul de factorielle Exemple Zone de code (instructions) Zone des données statiques factrec(n = 5) 5 factrec(4) Tas (données dynamiques) Thierry Lecroq (Univ. Rouen) Récursivité et TDA 13 / 48

Calcul de factorielle Exemple Zone de code (instructions) Zone des données statiques factrec(n = 5) 5 factrec(4) factrec(n = 4) 4 factrec(3) Tas (données dynamiques) Thierry Lecroq (Univ. Rouen) Récursivité et TDA 14 / 48

Calcul de factorielle Exemple Zone de code (instructions) Zone des données statiques factrec(n = 5) 5 factrec(4) factrec(n = 4) 4 factrec(3) factrec(n = 3) 3 factrec(2) Tas (données dynamiques) Thierry Lecroq (Univ. Rouen) Récursivité et TDA 15 / 48

Calcul de factorielle Exemple Zone de code (instructions) Zone des données statiques factrec(n = 5) 5 factrec(4) factrec(n = 4) 4 factrec(3) factrec(n = 3) 3 factrec(2) factrec(n = 2) 2 factrec(1) factrec(n = 1) 1 factrec(0) factrec(n = 0) Tas (données dynamiques) university-logo Thierry Lecroq (Univ. Rouen) Récursivité et TDA 16 / 48

Calcul de factorielle Exemple Zone de code (instructions) Zone des données statiques factrec(n = 5) 5 factrec(4) factrec(n = 4) 4 factrec(3) factrec(n = 3) 3 factrec(2) factrec(n = 2) 2 factrec(1) factrec(n = 1) 1 factrec(0) factrec(n = 0) 1 Tas (données dynamiques) university-logo Thierry Lecroq (Univ. Rouen) Récursivité et TDA 17 / 48

Calcul de factorielle Exemple Zone de code (instructions) Zone des données statiques factrec(n = 5) 5 factrec(4) factrec(n = 4) 4 factrec(3) factrec(n = 3) 3 factrec(2) factrec(n = 2) 2 factrec(1) factrec(n = 1) 1 1 Tas (données dynamiques) university-logo Thierry Lecroq (Univ. Rouen) Récursivité et TDA 18 / 48

Calcul de factorielle Exemple Zone de code (instructions) Zone des données statiques factrec(n = 5) 5 factrec(4) factrec(n = 4) 4 factrec(3) factrec(n = 3) 3 factrec(2) factrec(n = 2) 2 factrec(1) factrec(n = 1) 1 Tas (données dynamiques) university-logo Thierry Lecroq (Univ. Rouen) Récursivité et TDA 19 / 48

Calcul de factorielle Preuve n = 0 : factrec(0) = 1 = 0! HR : on suppose que factrec(k) retourne k! k < n n : factrec(n) = n factrec(n 1) = HR n (n 1)! = n! Thierry Lecroq (Univ. Rouen) Récursivité et TDA 20 / 48

Calcul de factorielle Complexité La complexité se calcule en nombre d appels. Pour n = 5 il y a 1 appel initial et 5 appels récursifs Proposition Le nombre d appels récursifs de factrec(n) est n. Preuve Par récurrence sur n n = 0 : aucun appel récursif HR : k < n le nombre d appels récursifs est k n : nbre d appels récursifs = 1 appel à factrec(n 1) + nbre d appels récursifs de factrec(n 1) = HR 1 + n 1 = n Au total le nombre d appels est égal à 1 appel initial + n appels récursifs = n + 1 appels Thierry Lecroq (Univ. Rouen) Récursivité et TDA 21 / 48 university-logo

Les nombres de Fibonacci F 0 = 0 F 1 = 1 F n = F n 1 + F n 2 n > 1 Thierry Lecroq (Univ. Rouen) Récursivité et TDA 22 / 48

Les nombres de Fibonacci Fonction itérative fonction fiboiter(n : entier) : entier auxiliaires e, f, i : entiers début si n = 0 alors retourner 0 sinon e 0 f 1 i 1 {f = F i } tant que i < n faire {e = F i 1, f = F i et i < n} f f + e {e = F i 1, f = F i+1 et i < n} e f e {e = F i, f = F i+1 et i < n} i i + 1 {e = F i 1, f = F i et i n} fin tant que {e = F i 1, f = F i et i = n} retourner f fin si fin university-logo Thierry Lecroq (Univ. Rouen) Récursivité et TDA 23 / 48

Les nombres de Fibonacci Fonction récursive fonction fiborec(n : entier) : entier début si n < 2 alors retourner n sinon retourner fiborec(n 1) + fiborec(n 2) fin si fin Thierry Lecroq (Univ. Rouen) Récursivité et TDA 24 / 48

La récursivité Intérêts Une fois le problème présenté de manière récursive, la construction de l algorithme est immédiate. Les preuves de programme faites par récurrence sont également très simples. Inconvénients La récursivité nécessite de l espace pour mémoriser les opérations en cours. Thierry Lecroq (Univ. Rouen) Récursivité et TDA 25 / 48

Plan 1 La récursivité 2 Les listes chaînées 3 Les types de données abstraits Thierry Lecroq (Univ. Rouen) Récursivité et TDA 26 / 48

Les listes chaînées Soit D un ensemble de valeurs (ou domaine). Une liste chaînée à valeurs dans D est une structure à accès séquentiel qui permet de représenter toute séquence sur D. Elle est formée : d un pointeur, dit tête de liste permettant d accéder au premier maillon de la liste ; d une séquence de maillons dont chacun pointe vers le suivant, excepté le dernier. Chaque maillon a deux composantes : une composante valeur sur D ; une composante pointeur. Thierry Lecroq (Univ. Rouen) Récursivité et TDA 27 / 48

Les listes chaînées La séquence sur D représentée par une liste chaînée est la séquence des composantes valeurs considérées à partir de la tête de liste. Exemple l 1 =< e 1, e 3, e 4 > l 2 =< e 2, e 5 > l 3 =<> La séquence vide est représentée par une tête de liste de valeur NIL (NULL en C, sur les dessins). La composante pointeur du dernier maillon d une liste non vide vaut NIL. Thierry Lecroq (Univ. Rouen) Récursivité et TDA 28 / 48

Les listes chaînées Manipulation type Liste = enregistrement element : D suivant : pointeur vers Liste fin enregistrement Pliste = pointeur vers Liste fonction listevide() : PListe début retourner NIL fin fonction getsuivant(l : Pliste) : Pliste Précondition : l est non vide début retourner l.suivant fin university-logo Thierry Lecroq (Univ. Rouen) Récursivité et TDA 29 / 48

Les listes chaînées Manipulation procédure setsuivant(l, p : Pliste) Précondition : l est non vide début l.suivant p fin fonction getélément(l : Pliste) : D Précondition : l est non vide début retourner l.element fin procédure setélément(l : Pliste, x : D) Précondition : l est non vide début l.element x fin university-logo Thierry Lecroq (Univ. Rouen) Récursivité et TDA 30 / 48

Les listes chaînées Manipulation fonction estlistevide(l : Pliste) : booléen début retourner l = NIL fin fonction ajoutentête(l : Pliste, x : D) : Pliste auxiliaire p : Pliste début p allouer setélément(p, x) setsuivant(p, l) retourner p fin Thierry Lecroq (Univ. Rouen) Récursivité et TDA 31 / 48

Les listes chaînées Programmation struct Liste { D element ; struct Liste * suivant ; } ; typedef struct Liste * PListe ; PListe listevide() { return NULL ; } PListe getsuivant(pliste l) { // Précondition : l est non vide return l suivant ; } Thierry Lecroq (Univ. Rouen) Récursivité et TDA 32 / 48

Les listes chaînées Programmation void setsuivant(pliste l,pliste p) { // Précondition : l est non vide l suivant= p ; } D getelement(pliste l) { // Précondition : l est non vide return l element ; } void setelement(pliste l, D x) { //Précondition : l est non vide l element= x ; } Thierry Lecroq (Univ. Rouen) Récursivité et TDA 33 / 48

Les listes chaînées Programmation int estlistevide(pliste l) { return l ==NULL ; } PListe ajoutentete(pliste l, D x) { p : Pliste p ; } p = (PListe)malloc(sizeof(struct Liste)) ; if (p ==NULL) exit(1) ; setelement(p, x) ; setsuivant(p, l) ; return p ; Thierry Lecroq (Univ. Rouen) Récursivité et TDA 34 / 48

Les listes chaînées Affichage Pour afficher les valeurs d une liste il faut la parcourir du premier maillon jusqu au dernier. Longueur Idem affichage Affichage inverse Application de la récursivité Thierry Lecroq (Univ. Rouen) Récursivité et TDA 35 / 48

Les listes chaînées fonction parcoursdirect(l : PListe) début tant que non estlistevide(l) faire écrire(getelement(l)) l getsuivant(l) fin tant que fin fonction longueur(l : PListe) : entier auxiliaire n : entier début n 0 tant que non estlistevide(l) faire n n + 1 l getsuivant(l) fin tant que retourner n fin university-logo Thierry Lecroq (Univ. Rouen) Récursivité et TDA 36 / 48

Les listes chaînées fonction parcoursinverse(l : PListe) début si non estlistevide(l) faire parcoursinverse(getsuivant(l)) écrire(getelement(l)) fin si fin Thierry Lecroq (Univ. Rouen) Récursivité et TDA 37 / 48

Les listes chaînées : implantation dynamique versus tableaux Avantages de l implantation dynamique bien adaptées pour la manipulation de séquences de longueurs différentes : gain de place mémoire ; insertion et suppression d un maillon sans avoir à réarranger les autres valeurs (insertion par déviation et suppression par court circuit ) : gain de temps. Inconvénient de l implantation dynamique accès séquentiel (pas direct contrairement aux tableaux), pour accéder au i e élément il faut accéder aux 1 er, 2 e,... et (i 1) e avant : perte de temps Thierry Lecroq (Univ. Rouen) Récursivité et TDA 38 / 48

Les listes chaînées On peut également représenter des listes chaînées dans des tableaux : 0 1 1 6 2 e 3 7 3 e 5 1 4 e 1 2 5 e 2 3 6 8 7 e 4 1 8 9 9 10 10 1 l 1 = 4, l 2 = 5, l 3 = 1 Liste des emplacements disponibles : libre = 0 university-logo Thierry Lecroq (Univ. Rouen) Récursivité et TDA 39 / 48

Les listes chaînées fonction allouer(t : tableau de maillons) auxiliaire i : entier début si libre = 1 alors erreur( plus de place ) sinon i libre libre T [libre].suivant retourner i fin si fin Thierry Lecroq (Univ. Rouen) Récursivité et TDA 40 / 48

Durée de vie d une variable dynamique de l instant où elle a été créée jusqu à la fin de l exécution du programme sauf : désallocation implicite par un mécanisme de ramasse-miettes (garbage collector) : collecte et agrège entre elles les zones mémoire qui ne sont plus référencées (effectif en Java mais pas en C) désallocation explicite par désallouer(p) (free(p) en C) qui rend disponible l espace occupé par p (ne change pas la valeur de la variable p) Attention aux références fantômes! Thierry Lecroq (Univ. Rouen) Récursivité et TDA 41 / 48

Plan 1 La récursivité 2 Les listes chaînées 3 Les types de données abstraits Thierry Lecroq (Univ. Rouen) Récursivité et TDA 42 / 48

Types de Données Abstraits (TDA) Un TDA est la description d un ensemble organisé d entités et des opérations de manipulation sur cet ensemble. Ces opérations comprennent les moyens d accéder et de modifier les éléments. Un TDA comprend : une partie interface (description de l ensemble et des opérations) ; une partie implémentation (description de la structure de données et des algorithmes de manipulation). interface : description des opérations possibles ; implémentation : explicite la représentation des éléments. Thierry Lecroq (Univ. Rouen) Récursivité et TDA 43 / 48

Types de Données Abstraits Le concept de TDA ne dépend pas d un langage de programmation. Le programmeur convient d accéder au TDA à travers l ensemble limité de fonctions définies par l interface et s interdit notamment tout accès direct aux structures de données sous-jacentes qui serait rendu possible par une connaissance précise de l implémentation particulière. La réalisation efficace de TDA par des structures de données qui implémentent les opérations de manière optimale en temps et en espace constitue l une des préoccupations de l algorithmique. Thierry Lecroq (Univ. Rouen) Récursivité et TDA 44 / 48

Les piles LIFO (Last In First Out) Une pile est une liste linéaire où les insertions et les suppressions se font toutes du même côté (analogie : pile d assiettes). insertion : empiler suppression : dépiler Si la pile n est pas vide, le seul élément accessible est le sommet de pile. Propriété fondamentale La suppression annule l insertion (si on empile un élément puis on dépile alors on se retrouve dans l état de départ). Thierry Lecroq (Univ. Rouen) Récursivité et TDA 45 / 48

Les piles Interface pilevide() : Pile retourne une pile vide getsommet(p : Pile) : D retourne l élément au sommet de la pile p, la pile p doit être non vide empiler(x : D, p : Pile) insère l élément x au sommet de la pile p dépiler(p : Pile) supprime l élément au sommet de la pile p, la pile p doit être non vide estpilevide(p : Pile) : booléen teste si la pile p est vide Thierry Lecroq (Univ. Rouen) Récursivité et TDA 46 / 48

Les files d attente FIFO (First In First Out) Une file est une liste linéaire où les insertions se font toutes d un même côté et où les suppressions se font toutes de l autre côté. insertion : enfiler suppression : défiler Si la pile n est pas vide, le seul élément accessible est la tête de file. Thierry Lecroq (Univ. Rouen) Récursivité et TDA 47 / 48

Les files Interface filevide() : File retourne une file vide gettête(f : File) : D retourne l élément en tête de la file f, la file f doit être non vide enfiler(x : D, f : File) insère l élément x en queue de la file f défiler(f : File) supprime l élément en tête de la file f, la file f doit être non vide estfilevide(f : File) : booléen teste si la file f est vide Thierry Lecroq (Univ. Rouen) Récursivité et TDA 48 / 48