1 / 21

ITI1520 Lab #8: Récursivité

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.

naasir
Download Presentation

ITI1520 Lab #8: Récursivité

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ITI1520Lab #8: Récursivité Gilbert Arbez, Mohamad Eid, Daniel Amyot, Sylvia Boyd, Diana Inkpen et Alan Williams

  2. Objectifs • Récursivité • 2 exemples simples (pour rafraîchir votre mémoire) • 3 exercices algorithmiques et de programmation

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

  4. 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)

  5. Récursivité – Algorithme - Suite MODULE: ResteDeChiffres= N / 10 ResteDeChiffres= 0 ? vrai faux Compteur  NombreDeChiffres(ResteDeChiffres)Compteur Compteur + 1 Compteur  1

  6. Trace pour N = 254

  7. Trace, page 2 Compteur  NombreDeChiffres(ResteDeChiffres) Compteur  NombreDeChiffres(N) 25

  8. Trace , page 3 Compteur  NombreDeChiffres(ResteDeChiffres) Compteur  NombreDeChiffres(N) 1 2

  9. Trace , page 2 Compteur  NombreDeChiffres(ResteDeChiffres) Compteur  NombreDeChiffres(N) 2 25

  10. Trace, page 1

  11. 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 = …

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

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

  14. 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]

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

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

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

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

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

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

  21. 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)

More Related