210 likes | 349 Views
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.
E N D
ITI1520Lab #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, page 2 Compteur NombreDeChiffres(ResteDeChiffres) Compteur NombreDeChiffres(N) 25
Trace , page 3 Compteur NombreDeChiffres(ResteDeChiffres) Compteur NombreDeChiffres(N) 1 2
Trace , page 2 Compteur NombreDeChiffres(ResteDeChiffres) Compteur NombreDeChiffres(N) 2 25
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 strictementcroissant (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)