ITI1520 Lab #8: Récursivité Gilbert Arbez, Mohamad Eid, Daniel Amyot, Sylvia Boyd, Diana Inkpen et Alan Williams
Objectifs Récursivité 2 exemples simples (pour rafraîchir votre mémoire) 3 exercices algorithmiques et de programmation
Récursivité – Exemple simple Écrivez un algorithme récursif qui compte le nombre de chiffres dans un nombre entier non-négatif N. Exemple: si N = 34567, alors le résultat est 5. Si N = 1234567890, alors le résultat est 10.
Récursivité – Algorithme DONNÉE: N (un nombre entier non-négatif) INTERMÉDIAIRE: ResteDeChiffres (chiffres restants) RÉSULTAT: Compteur (nombre de chiffres dans N) EN-TÊTE: Compteur NombreDeChiffres(N)
Récursivité – Algorithme - Suite MODULE: ResteDeChiffres = N / 10 ResteDeChiffres = 0 ? vrai faux Compteur NombreDeChiffres(ResteDeChiffres) Compteur Compteur + 1 Compteur 1
Trace pour N = 254 Ligne N ResteDe Chiffres Comp-teur Valeurs initiales 254 ? (1) ResteDeChiffres = N / 10 25 (2) ResteDeChiffres = 0 ? faux (3) Appel Compteur NombreDeChiffres(ResteDeChiffres) (4) Compteur Compteur + 1
Trace, page 2 Compteur NombreDeChiffres(ResteDeChiffres) Compteur NombreDeChiffres(N) 25 Ligne N ResteDe Chiffres Comp-teur Valeurs initiales 25 ? (1) ResteDeChiffres = N / 10 2 (2) ResteDeChiffres = 0 ? faux (3) Appel Compteur NombreDeChiffres(ResteDeChiffres) (4) Compteur Compteur + 1
Trace , page 3 Compteur NombreDeChiffres(ResteDeChiffres) Compteur NombreDeChiffres(N) 1 2 Ligne N ResteDe Chiffres Compteur Valeurs initiales 2 ? (1) ResteDeChiffres = N/10 (2) ResteDeChiffres = 0 ? vrai (5) Compteur 1 1
Trace , page 2 Compteur NombreDeChiffres(ResteDeChiffres) Compteur NombreDeChiffres(N) 2 25 Ligne N ResteDe Chiffres Comp-teur Valeurs initiales 25 ? (1) ResteDeChiffres = N / 10 2 (2) ResteDeChiffres = 0 ? faux (3) Appel Compteur NombreDeChiffres(ResteDeChiffres) 1 (4) Compteur Compteur + 1
Trace, page 1 Ligne N ResteDe Chiffres Compteur Valeurs initiales 254 ? (1) ResteDeChiffres = N / 10 25 (2) ResteDeChiffres = 0 ? faux (3) Appel Compteur NombreDeChiffres(ResteDeChiffres) 2 (4) Compteur Compteur + 1 3
Regardons comment le code fourni fonctionne Voir CompteChiffres.java L’implémentation Java de cet algorithme a été augmentée avec des instructions d’affichage pour indiquer où nous entrons/sortons d’une invocation, et pour tracer la valeur locale de n): Immédiatement après la variable locale des déclarations 1: Entrant la méthode avec n = … Juste avant l’appel de la méthode récursive: 2: Appel récursif venant de n = … Juste après l’appel de la méthode récursive: 3: Revenant d’un appel récursif avec n = … Juste avant la commande “return” 4: Retournant de la méthode avec n = …, compteur = … Dans le cas de base 5: Cas de base avec n = …
2e exemple simple Écrivez un algorithme récursif qui vérifie si un tableau d’entier A est trié en ordre croissant. Note: croissant est différent de strictement croissant (où deux éléments ne peuvent pas être égaux) La taille de A est supérieure ou égale à 2. Exemples: A = {3, 6, 8, 5, 9}: Faux A = {4, 5, 6, 6, 9, 14}: Vrai
2e exemple - solution DONNÉES: A (tableau d’entiers) N (taille du tableau A) RÉSULTAT: Trié (Booléen: vrai si A est trié) INTERMÉDIAIRE: TriéPetit (Booléen: vrai si un A plus petit est trié) EN-TÊTE: Trié VérifieTrié(A,N) HYPOTHÈSE: N 2
2e exemple – solution simple MODULE: N = 2? faux vrai Cas de base… TriéPetit VérifieTrié(A, N-1) Trié TriéPetit ET (A[N-2] A[N-1]) Trié A[0] A[1]
2e exemple – solution efficace Plus besoin de se rendre à A[0] si on remarque auparavant que A n’est pas trié! On arrête avant de faire l’invocation récursive… MODULE: A[N–2] A[N–1] ? faux vrai N = 2 ? Trié Faux vrai faux Trié VérifieTrié(A, N-1) Trié Vrai
Exemple 2 – Programme Java Voir TableauTrier.java Examinez la traduction de l’algorithme au Java, exécutez et tester. Insérez des appels System.out.println pour tracer l’exécution de la méthode récursive.
Exercice #1 Écrivez un algorithme récursif pour vérifier si tous les caractères aux positions 0...N d’un tableau de caractères (A) sont des chiffres. Hypothèse: la taille de A est plus grande que N. Commencez avec le document Word Lab8Ex1.doc pour développez votre algorithme. Notez que l’algorithme Principal vous est fourni. Traduisez votre algorithme au Java Un programme partiel vous est fourni – VerifieChiffre.java.
Exercice #2 Écrivez un algorithme récursif pour créer un tableau contenant les valeurs de 0 à N-1. Commencez avec le document Word Lab8Ex2.doc pour développez votre algorithme. Notez que l’algorithme Principal vous est fourni. Traduisez votre algorithme au Java Un programme partiel vous est fourni – CreerTableau.java. Indice: Vous aurez parfois besoin de 2 algorithmes: Un premier algorithme pour faire une initialisation et démarrer la récursivité en invoquant le second algorithme Un second algorithme, qui lui est récursif et qui fait le gros du travail.
Exercice #3 – Algorithme d’Euclide Le Plus Grand Commun Diviseur (PGCD) de deux nombres entiers est le plus grand entier qui divise les deux nombres avec un restant de 0. L’algorithme d’Euclid pour trouver le PGCD de x et y est: pgcd(x,y) est … y si x ≥ y et x mod y est 0 pgcd(y, x) si x < y pgcd(y, x mod y) autrement Si on assure que x ≥ y, alors l’algorithme devient pgcd(x, y) est … y si x mod y est 0 pgcd(y, x mod y) autrement
Exercice #3 – Algorithme d’Euclide L’algorithme récursif pour notre logiciel devient: M Max(x, y) (doit développer l’algorithme Max) N x + y – M (donc, le minimum de x et y) Cas de base: M MOD N = 0 le résultat est N Cas récursif: Réduction: M M MOD N Récursivité: ResPartiel PGCD(N, M) Résultat: ResPartiel Question: est-ce que l’algorithme atteint toujours le cas de base: Notez que M MOD N est au plus N-1.
Exercice #3 - Algorithme d’Euclide Écrivez un algorithme récursif pour trouver le Plus Grand Commun Diviseur (PGCD) de deux nombres x et y. Commencez avec le fichier Word Lab8Ex3.doc Notez que vous devez développez 2 algorithmes, un pour Max et un pour CalcPGCD Vous n’avez PAS à développer un algorithme principal. Traduisez vos algorithmes au Java Créez la class Euclide et traduisez les deux algorithmes à des méthodes Java Testez les méthodes avec l’onglet Interaction du Dr Java pour appeler la méthode calcPGCD. Euclide.calcPGCD(1234,4321) Euclide.calcPGCD(8192,192)