Chapitre 11: Récursivité. Qu est-ce que la récursivité? Penser récursivement. Définition récursive d une liste



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

Projet de programmation (IK3) : TP n 1 Correction

Programme Compte bancaire (code)

Programmation avec des objets : Cours 7. Menu du jour

Initiation à l algorithmique

Java Licence Professionnelle CISII,

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Corrigé des exercices sur les références

Programmation par les Objets en Java

Chapitre 10. Les interfaces Comparable et Comparator 1

Programmer en JAVA. par Tama

Tp 1 correction. Structures de données (IF2)

OpenPaaS Le réseau social d'entreprise

Solutions du chapitre 4

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Premiers Pas en Programmation Objet : les Classes et les Objets

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

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

Package Java.util Classe générique

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Plan du cours. Historique du langage Nouveautés de Java 7

Corrigés des premiers exercices sur les classes

Un ordonnanceur stupide

Utilisation d objets : String et ArrayList

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

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Une introduction à Java

Exercices sur les interfaces

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Auto-évaluation Programmation en Java

TD/TP PAC - Programmation n 3

Langage Java. Classe de première SI

Threads. Threads. USTL routier 1

Programmation Orientée Objet Java

TP, première séquence d exercices.

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

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

Programmation Par Objets

INF 321 : mémento de la syntaxe de Java

Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée)

Flux de données Lecture/Ecriture Fichiers

TP1 : Initiation à Java et Eclipse

STAGE IREM 0- Premiers pas en Python

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Programmation Objet I

ACTIVITÉ DE PROGRAMMATION

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

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

Apprendre Java en 154 minutes

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Cours 1: Java et les objets

Introduction à JDBC. Accès aux bases de données en Java

2. Comprendre les définitions de classes

TD/TP PAC - Programmation n 3

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Chapitre V. Les classes : Object, Vector, etc.

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Introduction : les processus. Introduction : les threads. Plan

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig

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

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

ALGORITHMIQUE ET PROGRAMMATION ORIENTEE OBJET

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

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Interfaces graphiques avec l API Swing

TP Programmation Java / JDBC / Oracle

as Architecture des Systèmes d Information

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Dis papa, c est quoi un bus logiciel réparti?

Applet pour visualiser les variables «automate» notifiées

Synchro et Threads Java TM

Prendre le marteau, le tableau, le mètre, le crayon, la ficelle, le clou, la pointe ;

ETUDE DE CAS en UML : GESTION DES COMMANDES DE PIECES FABRIQUEES PAR LA SOCIETE C

4. Groupement d objets

TD2 Programmation concurrentielle

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Environnements de développement (intégrés)

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

Utiliser Java sans BlueJ

SPECIFICATIONS TECHNIQUES BANNIERES SITES PRISMA / TABLETTES / MOBILE

Remote Method Invocation Les classes implémentant Serializable

Développement Logiciel

that the child(ren) was/were in need of protection under Part III of the Child and Family Services Act, and the court made an order on

Programmation en Java IUT GEII (MC-II1) 1

Paginer les données côté serveur, mettre en cache côté client

Débuter avec EXPRESS. Alain Plantec. 1 Schema 2

Notes de cours Practical BigData

Généralités sur le Langage Java et éléments syntaxiques.

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Paris Airports - Web API Airports Path finding

Gestion distribuée (par sockets) de banque en Java

Le prototype de la fonction main()

Exercices sur SQL server 2000

Programmation Objet Java Correction

Transcription:

Chapitre 11: Récursivité CSI150 Introduction au génie logiciel Chapitre 11: Récursion La récursivité est une technique fondamentale de programmation qui permet de résoudre élégamment certains types de problème. Objectifs du cours: Apprendre à penser de manière récursive. Apprendre à programmer de manière récursive. Distinguer les cas d utilisation de la récursivité et de l itération. Comprendre les exemples utilisant la récursivité. Avoir un aperçu des fractales. Qu est-ce que la récursivité? Penser récursivement La récursivité est une technique de programmation dans laquelle une fonction s appelle elle-même pour résoudre un problème. Avant d appliquer la récusivité en programmation, il faut s entraîner à penser récursivement. Considérons la liste d entiers suivante: 4, 88, 40, 37 Une liste peut être définie récursivement. Une idée? Définition récursive d une liste Une liste peut être définie récursivement par: A LIST is a: number or a: Ainsi un objet LIST peut être défini par un nombre ou par un nombre suivi d une virgule et d un autre objet LIST. Le concept d objet LIST est utilisé dans la définition d un objet LIST. 3 4 Définitions récursives La partie récursive de l objet LIST est utilisée plusieurs fois; la partie non récursive terminant la définition de l objet. Exemple: 4, 88, 40, 37 88, 40, 37 40, 37 number 37 Eviter les appels récursifs infinis: la condition d arrêt Toutes les définitions récursives possèdent une condition d arrêt i.e. une partie non récursive. Si cette dernière manque, une fonction récursive ne se terminera jamais (boucle de récursivité infinie). Le code d une méthode récursive doit pouvoir traiter les deux cas: Le cas correspondant à la condition d arrêt. Le cas récursif. Quelle est la condition d arrêt dans le cas LIST? 5 6 1

Définitions récursives de fonctions mathématiques Définitions récursives: N! N!, pour tout entier positif est défini comme étant le produit de tous les entiers de 1 à N inclus. Cette fonction peut être exprimée récursivement par: 1! = 1 N! = N * (N-1)! Le concept de factorielle est défini à l aide d une autre factorielle jusqu à ce que le cas limite de 1! soit atteint. 10 5! 5 * 4! 4 * 3! 3 *! * 1! 4 6 7 1 8 Programmation récursive: autre exemple Considérez le problème consistant à calculer la somme des entiers de 1 à N inclus. Ce problème peut être exprimé récursivement par: N = etc. N-1 = N + = N + (N-1) + N- Programmtion récursive, calcul de la somme: public int (int num) int result; if (num == 1) result = 1; result = num + (num - 1); 9 10 Programmtion récursive : Exécution du programme Récursivité contre itération main (3) résultat = 6 résultat = 3 () résultat = 1 (1) Pouvoir résoudre récursivement un problème n est pas toujours la panacée. Par exemple la somme (ou le produit) d entiers de 1 à N peut être calculée à l aide d une boucle for. Vous devez être capables de déterminer quand une approche récursive est appropriée pour résoudre un problème. 11 1

Récursivité indirecte Récursivité indirecte Une méthode s appelant elle-même est considérée comme étant directement récursive. Cependant une autre possible existe: une méthode peut appelant une autre méthode qui elle-même en appellera une autre, ainsi de suite, la méthode initiale étant finalement appelée. Par exemple une méthode m1 peut appeler une méthode m, qui appellera m3, cette dernière rappelant m1 jusqu à ce qu une condition de terminaison soit atteinte. Ceci est appelé une récursivité indirecte et demande autant de soins qu une récursivité directe. De plus une récursivité indirecte est souvent plus dure à suivre et à déboguer. m1 m m3 m1 m m3 m1 m m3 13 14 Un exemple de récursivité: le parcours d un labyrinthe. Parcours de labyrinthe: Grille labyrinthique et sortie On peut utiliser la récursivité pour trouver un chemin dans un labyrinthe; un chemin pouvant être trouvé à partir d une location arbitraire si l on connaît les chemins menant aux locations voisines. Chaque location rencontrée sera marquée comme ayant été visitée et nous essayerons de trouver un chemin jusqu à ses voisines non encore visitées. La récursivité garde en mémoire le chemin parcouru à travers le labyrinthe. Les conditions d arrêt sont déplacement interdit et destination finale atteinte. La grille 1 1 1 0 1 1 0 0 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 0 1 0 0 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 Le résultat: The maze was successfully traversed! 7 7 7 0 1 1 0 0 0 1 1 1 1 3 0 7 7 7 0 7 7 71 0 0 1 0 0 0 0 7 0 7 0 7 0 3 0 0 7 7 7 0 7 7 7 0 7 0 3 3 3 7 0 7 0 0 0 0 7 73 0 0 3 7 0 7 7 7 7 7 7 0 3 3 3 3 7 0 0 0 0 0 0 0 0 0 0 0 0 7 7 7 7 7 7 7 7 7 7 7 7 7 15 16 Traversée labyrinthique: MazeSearch.java public class MazeSearch public static void main (String[] args) Maze labyrinth = new Maze(); System.out.println (labyrinth); if (labyrinth.traverse (0, 0)) System.out.println ("The maze was successfully traversed!"); System.out.println ("There is no possible path."); System.out.println (labyrinth); 17 Maze.java public class Maze private final int TRIED = 3; private final int PATH = 7; private int[][] grid = 1,1,1,0,1,1,0,0,0,1,1,1,1, 1,0,1,1,1,0,1,1,1,1,0,0,1, 0,0,0,0,1,0,1,0,1,0,1,0,0, 1,1,1,0,1,1,1,0,1,0,1,1,1, 1,0,1,0,0,0,0,1,1,1,0,0,1, 1,0,1,1,1,1,1,1,0,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1 ; Continued 18 3

Maze.java (suite.) public boolean traverse (int row, int column) boolean done = false; if (valid (row, column)) grid[row][column] = TRIED; // this cell has been tried if (row == grid.length-1 && column == grid[0].length-1) done = true; // the maze is solved done = traverse (row+1, column); // down done = traverse (row, column+1); // right done = traverse (row-1, column); // up done = traverse (row, column-1); // left if (done) // this location is part of the final path grid[row][column] = PATH; return done; suite Maze.java (suite.) // Détermine si une location donnée est valide. private boolean valid (int row, int column) boolean result = false; // check if cell is in the bounds of the matrix if (row >= 0 && row < grid.length && column >= 0 && column < grid[row].length) // check if cell is not blocked and not previously tried if (grid[row][column] == 1) result = true; suite 19 0 Maze.java // retourne le lqbyrinthe comme chaîne de caractères. public String tostring () String result = "\n"; for (int row=0; row < grid.length; row++) for (int column=0; column < grid[row].length; column++) result += grid[row][column] + ""; result += "\n"; Problème récursif classique: Tours de Hanoi Les tours de Hanoi sont un casse-tête composé de trois tiges verticales et de différents disques pouvant être insérés dessus. Le but est de déplacer tous les disques d une tige à une autre en suivant les règles suivantes: Ne bouger qu un disque à la fois. On ne peut placer un disque plus large sur un moins large. Tous les disques doivent être autour de tiges sauf le disque manipulé. 1 Tours de Hanoi Nous utilisons 3 tiges pour accomplir cette tâche. Voir p. 616 du livre de cours. Récursivité en dessin: les fractales Une fractale est une forme géométrique consistant d un motif se répétant à diverses échelles et orientations Le flocon de Koch est une fractale particulière commençant à partir d un triangle équilatéral. Pour passer à l ordre supérieur, le milieu de chaque arête est remplacé par segments formant un angle prédéfini. 3 4 4

Fractales: Modélisation du chaos et caetera Sommaire: Chapitre 11 Objectifs du cours: Apprendre à penser de manière récursive. Apprendre à programmer de manière récursive. Distinguer les cas d utilisation de la récursivité et de l itération. Comprendre les exemples utilisant la récursivité. Avoirunaperçudesfractales. 5 6 5