CSI1502 Introduction au génie logiciel

Slides:



Advertisements
Présentations similaires
La Méthode de Simplexe Standardisation
Advertisements

Explorer un espace d’états
Chapitre annexe. Récursivité
Julie Dugdale Génie Logiciel 2 Julie Dugdale
Fonctions & procédures
Calcul géométrique avec des données incertaines
Le mécanisme des exceptions
SI3 MAM3 Hydro Nathan Cohen Igor Litovsky Christophe Papazian
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
Calculs de complexité d'algorithmes
La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
Les Prepositions.
Cours MIAGE « Architectures Orientées Services » Henry Boccon-Gibod 1 Architectures Orientées Services Composants de Service Exemple pratique de développement.
(Classes prédéfinies – API Java)
L’ interruption de boucle
Cours n°2M2. IST-IE (S. Sidhom) UE 303 Promo. M2 IST-IE 2005/06 Conception dun système d'information multimédia Architecture trois-tiers : PHP/MySQL &
Algorithme et structure de données
LICENCE MIAGE Introduction Programmation Orientée Objet JAVA philippe
ESIEE Paris © Denis BUREAU I N Initiation à la programmation avec le langage Java.
Introduction à la programmation (420-PK2-SL) cours 15 Gestion des applications Technologie de linformation (LEA.BW)
1 Théorie des Graphes Cycle Eulérien. 2 Rappels de définitions On dit qu'une chaîne est un chemin passant par toutes les arêtes du graphe. On dit qu'un.
ALGORITHMES RECURSIFS
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
OCaml - Les listes L3 MI.
Récursivité.
44 Contrôle du déroulement du programme. 4-2 Objectifs A la fin de ce cours, vous serez capables de : Utiliser les constructions de prise de décision.
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
Les algorithmes: complexité et notation asymptotique
Langage Oriente Objet Cours 4.
Chapitre 2 Les vecteurs 2.0 Introduction
1 Les pointeurs et quelques rappels sur certains éléments du langage C.
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
Classes abstraites et Interfaces
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 5 – Héritage, Interfaces et Listes génériques.
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
66 Utilisation des classes et des objets. 6-2 Objectifs A la fin de ce cours, vous serez capables de : Créer de nouvelles classes à laide de Eclipse Utiliser.
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
Les Fonctions. Définir une fonction Sections de code indépendantes que lon peut appeler à nimporte quel moment et dans nimporte quel ordre. Bout de code.
GPA789 Analyse et conception orientées objet 1 Professeur: Tony Wong, Ph.D., ing. Chapitre 6 Correspondance UML et C++
Programmation concurrente
IFT 6800 Atelier en Technologies d’information
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
Chapitre 9 Les sous-programmes.
Chapitre 3 Syntaxe et sémantique.
COURS DE PROGRAMMATION ORIENTEE OBJET :
COURS DE PROGRAMMATION ORIENTEE OBJET :
CSI 1502 Principes fondamentaux de conception de logiciels
CSI1502 Principes fondamentaux en conception des logiciels
Le diagramme de séquences
Atelier de formation : MAT optimisation II (les graphes).
99 Réutilisation du code grâce à l'héritage. 9-2 Objectifs À la fin de ce cours, vous serez capables de : Définir l'héritage Utiliser l'héritage pour.
Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009.
Récursion IFT1025: Programmation 2 Jian-Yun Nie. Définition Le fait pour un programme ou une méthode de s'appeler lui-même. Par exemple –Définir la notion.
Structures de données IFT-2000 Abder Alikacem La récursivité Département d’informatique et de génie logiciel Édition Septembre 2009.
1111 Gestion des exceptions Objectifs À la fin de ce cours, vous serez capables de : • Expliquer les concepts de base de la gestion des exceptions.
Objectifs À la fin de ce cours, vous serez capables de :
Ch. PAUL - Piles et Files à l'aide de listes chainées
Algorithmique Les structures Rappel L'enchaînement séquentiel
LES PILES ET FILES.
INTRODUCTION.
11/04/ L'héritage Cours 7 Cours 7.
Cours du 5 novembre.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Introduction au langage C : Structures de contrôle 1 ère année Génie Informatique Dr Daouda Traoré Université de Ségou
CPI/BTS 2 Algorithmique & Programmation La récursivité Algo – Prog CPI/BTS2 – M. Dravet – 14/09/2003 Dernière modification: 14/09/2003.
Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département d’informatique et de génie logiciel Édition Septembre 2009.
Philippe Gandy - 8 septembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
Java Réalisé par: Mouna POKORA. PLAN: Définition : Historique: Caractéristiques: un langage orienté objet: un langage interprété : un langage portable:
Chapter 11: Récursivité Java Software Solutions Second Edition
Transcription de la présentation:

CSI1502 Introduction au génie logiciel Chapitre 11: Récursion

Chapitre 11: Récursivité 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: 24, 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: number comma LIST 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.

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: number comma LIST 24 , 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?

Définitions récursives de fonctions mathématiques 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.

Définitions récursives: N! 5! 5 * 4! 4 * 3! 3 * 2! 2 * 1! 1 2 6 24 120

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: i = 1 N N-1 N-2 = N + = N + (N-1) + = etc.

Programmtion récursive, calcul de la somme: public int sum (int num) { int result; if (num == 1) result = 1; else result = num + sum (num - 1); return result; }

Programmtion récursive : Exécution du programme main sum sum(3) sum(1) sum(2) résultat = 1 résultat = 3 résultat = 6

Récursivité contre itération 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.

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 m2, 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.

Récursivité indirecte m1 m2 m3

Un exemple de récursivité: le parcours d’un labyrinthe. 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.

Parcours de labyrinthe: Grille labyrinthique et sortie 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 7 1 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 7 3 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

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!"); else System.out.println ("There is no possible path."); System.out.println (labyrinth); } }

Traversée labyrinthique : 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…

Traversée labyrinthique : 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 else { done = traverse (row+1, column); // down if (!done) done = traverse (row, column+1); // right if (!done) done = traverse (row-1, column); // up if (!done) done = traverse (row, column-1); // left } if (done) // this location is part of the final path grid[row][column] = PATH; } return done; } suite…

Traversée labyrinthique : 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; return result; } suite…

Traversée labyrinthique : 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"; } return result; } }

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é.

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 2 segments formant un angle prédéfini.

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é. Avoir un aperçu des fractales.