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.

Slides:



Advertisements
Présentations similaires
A RECUPERER EN ENTRANT Le polycopié de Caml Partie 1
Advertisements

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.
(Classes prédéfinies – API Java)
L’ interruption de boucle
JAV - TD 6 Structures de données JAVA
TD 1 IJA Introduction Objet, méthode, attribut Classe, instance
Paramètres et pointeurs
Les fonctions en Java Partie I Le type void. Dans cette rapide présentation, je vais expliquer :.à quoi servent les fonctions.à quoi faut-il penser avant.
Introduction à la programmation (420-PK2-SL) cours 15 Gestion des applications Technologie de linformation (LEA.BW)
1 Une introduction à Java IFT 287 (Semaine 1). 2 Java - Historique Développé par Sun Microsystems en 1994 –Inventeur James Gosling (canadien!) Objectif.
Structures collectives en Java
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
Récursivité.
UNIVERSITE CHOUAIB DOUKKALI Département des mathématiques
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.
Langage Oriente Objet Cours 4.
Badr Benmammar Programmation concurrente et temps réel en Java Badr Benmammar
IFT1025, Programmation 2 Jian-Yun Nie
© 2007 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java et les Exceptions Peter Van Roy Département dIngénierie Informatique,
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
Introduction à la programmation (Java)
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 5 – Héritage, Interfaces et Listes génériques.
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.
Révision des notions OO et Java Semaine 1 Jian-Yun Nie.
Présentation Structures de Données et TDA
IFT 6800 Atelier en Technologies d’information
1 Les paquetages («packages»). 2 L'objectif avec les paquetages («packages») est de rendre accessibles aux utilisateurs des classes définies par d'autres.
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
Les arbres binaires.
Chapitre 9 Les sous-programmes.
Badr Benmammar Programmation concurrente et temps réel en Java Badr Benmammar
Cours 4 Héritage (suite).
COURS DE PROGRAMMATION ORIENTEE OBJET :
COURS DE PROGRAMMATION ORIENTEE OBJET :
CSI1502 Introduction au génie logiciel
CSI 1502 Principes fondamentaux de conception de logiciels
CSI1502 Principes fondamentaux en conception des logiciels
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.
Une introduction à Java
Structures de données IFT-2000 Abder Alikacem La récursivité Département d’informatique et de génie logiciel Édition Septembre 2009.
Structures de données IFT-2000
Cours 7 Divers et exceptions. Chapitre V Enumeration, tableaux, conversion de types, noms.
Algorithmique Les structures Rappel L'enchaînement séquentiel
Notion de fonction A partir d’un exemple Types de fonctions
4 Introduction des objets. Les chaînes et tableaux
LIFI-Java 2004 Séance du Mercredi 22 sept. Cours 3.
Programmation en Java Tableaux NGUYEN Thi Minh Tuyen
Cours 1 1 Java. Cours 1 2 Plan général 1.Introduction 2.Les types primitifs, évaluation d’expressions 3.Instructions for, if…. 4.Introduction de l’objet,
Cours 61 6 La sécurité, Portée, Visibilité Programmer avec sécurité.
Java : Exceptions H Batatia. 5/03/2004Java12: H.Batatia2 Exemple 1 public class Bonjour { public static void main(String[] args) { System.out.println("Bonjour.
11/04/ L'héritage Cours 7 Cours 7.
14 La gestion d’événements
Cours C++ Fonctions Surcharge d’opérateurs Passage d’arguments
© 2005 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java Peter Van Roy Département d’Ingénierie Informatique, UCL
Tutorat en bio-informatique
Strings et Tableaux en Java
Les classes et les objets Les données finales class A { … private final int n = 20 ; // la valeur de n est définie dans sa déclaration … } class A { public.
Cours LCS N°4 Présenté par Mr: LALLALI
Le polymorphisme.
Cours du 5 novembre.
IUT du Limousin L.U.P Michel Vergnaud Programmation Objet - Java.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
LIFI-Java 2004 Séance du Mercredi 29 sept. Cours 4.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 2 – Java Premiers pas Master 1 SIGLIS1 Java Lecteur - Chapitre 2 - Java Premiers Pas.
IUT du limousin L.U.P Michel Vergnaud Programmation Objet - Java.
Généricité.
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.
Transcription de la présentation:

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 de « ancêtre » Les parents sont des ancêtres Les ancêtres des parents sont des ancêtres –Définition de « ami » Les gens directement autour de moi sont des amis Les amis de mes amis sont mes amis

Pourquoi récursion Certains problèmes en informatiques sont de nature récursive –Ne peuvent pas être résolus sans récursion –E.g. ancêtre et ami Certains problèmes peuvent être formulés de façon plus concise et claire avec récursivité

Un exemple en Java class Test { … public int calcul(int val) { if (val<=0) return 0 else return val + calcul(val-1); }

Quelques fonctions mathématiques Fibobacci n: Fibo(n): Une fonction de nature récursive –La valeur de fibo(n) dépend de fibo(n-1) et fibo(n-2)

Définition d’une fonction récursive Cas simple –Problème directement résoluble –Pas de récursion Cas récursif (cas complexe) –Appel à la même fonction –Pour des cas plus simples n-1, n-2 sont plus simples que n Cas simples Cas récursif

Forme d’une méthode récursive Méthode pour un problème n –Si n est directement résoluble, retourner une réponse ou faire un traitement direct –Sinon (cas récursif) 1.Décomposer le problème n en des sous problèmes moins complexes: n1, n2, … 2.Appel à Méthode pour traiter n1, n2, … 3.Utiliser les résultats pour n1, n2, … pour composer un résultat pour n

Exemple fibonacci Fibo(n) –Si n=0 ou n=1: cas simple Retourner le résultat = 1 –Si non (n>1): cas complexe Décomposer le problème en deux parties –n-1 et n-2 –Appel a la méthode pour les traiter: fibo(n-1), fibo(n-2) –Composer le résultat pour n: fibo(n-1)+fibo(n-2)

Importants pour réussir la récursion Bien définir le cas simple –Pour arrêter la récursion –Sinon, récursion à l’infinie Bien décomposer le problème –En sous-problèmes plus simples –Si les sous-problèmes sont aussi complexes: récursion à l’infinie

Mauvais exemples Sans une bonne condition d’arrêt: Une mauvaise décomposition

En Java public double fibo(int n) { if n<=1 return 1 else return fibo(n-1)+fibo(n-2); } Attention: à chaque récursion, on teste d’abord pour traiter le cas simple en premier

Exécution fibo(4) fibo(3)fibo(2) fibo(2)fibo(1)fibo(1)fibo(0) fibo(1)fibo(0) 1

Exécution fibo(4)? fibo(3)? fibo(2)? fibo(1)?fibo(0)?fibo(1)? fibo(0)?fibo(1)?

Fonction transformable en récursive Factoriel n: Fac(n): Somme:

En Java public double fact(int n) { int i; double f=1; for (i=1; i<=n; i++) f = f*n; return f; } public double somme(int n) { int i; double f=0; for (i=1; i<=n; i++) f = f+n; return f; } public double fact(int n) { if n=1 return 1 else return n*fact(n-1); } public double somme(int n) { if n=1 return 1 else return n+somme(n-1); }

Un autre exemple traverser un tableau Problème initial: traverser le tableau à partir de l’indexe 0 (jusqu’à la fin) Le problème est décomposable ? –Pour traverser à partir de l’indexe i Traverser l’élément courant i Traverser le reste du tableau – à partir de i+1 –Attention: condition d’arrêt! Traverser le reste – à partir de i+1 si il en reste

Traverser Structure d’une méthode –traverser(i, tableau) Traiter i Si non à la fin du tab, traverser(i+1, tableau) Appel pour traverser complètement un tableau int [ ] tableau; traverser(0, tableau);

import java.io.*; // class Parcours { // static void croissant( int index, int [] tableau ) { if( ( null != tableau ) && ( index >= 0 ) && ( index < tableau.length ) ) { System.out.println( tableau[index]); croissant( index + 1, tableau ); } // static void decroissant( int index, int [] tableau ) { if( ( null != tableau ) && ( index >= 0 ) && ( index < tableau.length ) ) { decroissant( index + 1, tableau ); System.out.println( tableau[ index ] ); } // public static void main( String [] args ) { // initialiser le tableau int [] tableau = new int [ 10 ]; for( int i = 0; i < 10; ++i ) tableau[ i ] = i; croissant( 0, tableau ); decroissant( 0, tableau ); }

Utiliser d’une méthode utilitaire Quand on appelle une méthode pour parcourir complètement un tableau, on ne devrait pas avoir besoin de spécifier l’index du début (0). –Appel normal: parcours(tab) Solution: –Une méthode à être appelée de l’extérieur : parcours(tableau) –Une autre méthode utilitaire qui utilise un index dans ses paramètres afin de faire la récursion : parcours_help(i, tableau) –parcours(tableau) appelle parcours_help(0, tableau)

import java.io.*; // class Parcours { // parcours_help est identique à croissant static void parcours_help( int index, int [] tableau ) { if( ( null != tableau ) && ( index >= 0 ) && ( index < tableau.length ) ) { System.out.println( tableau[index]); croissant( index + 1, tableau ); } // static void parcours (int [] tableau ) { parcours_help(0, tableau); } // public static void main( String [] args ) { // initialiser le tableau int [] tableau = new int [ 10 ]; for( int i = 0; i < 10; ++i ) tableau[ i ] = i; parcours( tableau ); }

Un problème plus complexe Tours de Hanoi: Problème: déplacer les n disques d’une tour à un autre Contraintes –Déplacer un disque à la fois –Plus gros disque jamais sur de plus petits

Origine Une légende raconte qu’un groupe de moines, gardien des trois tours, doivent déplacer 64 anneaux d’or d’une tour à une autre en respectant la règle unique qui stipule qu’un anneau ne doit pas reposer sur un anneau plus petit. Lorsque les moines auront déplacé les 64 anneaux, le monde se détruira.

Situations typique Libérer le dessus Déplacer le dernier Déplacer les autres

Décomposition Déplacer n disque de tour 1 à 3 –Si n=1: déplacer le disque directement Cas simple, condition d’arrêt de récursion –Sinon Déplacer n-1 disque de 1 à 2 –Problème moins complexe Déplacer 1 disque de 1 à 3 –Problème résoluble directement Déplacer n-1 disque de 2 à 3 –Problème moins complexe

Illustration Illustration

Une vue plus synthétique Déplacer 2 premier de A à B Déplacer 2 de B à A

En Java Stocker n disques dans un tableau de int Utiliser int pour désigner la grandeur de disque E.g.: –tour[1] = {4,3,2,1}; –Mieux: le générer automatiquement Supposons 3 tours: tour[1], tour[2], tour[3] public void deplacer(n,i,j): déplacer n disque de tour i à tour j –Si n=1: mettre un disque de tour[i] à tour[j] –Sinon: deplacer(n-1,i,6-i-j) deplacer(1,i,j) deplacer(n-1,6-i-j,j) Utilisation (Test) –Générer 3 tours –Appeler déplacer (Lab)