Récursivité Définition récursive d’un problème. Critère d’arrêt et convergence. Performance des algorithmes récursifs. Résolution d’un problème à l’aide.

Slides:



Advertisements
Présentations similaires
Chaîne de Synthèse Réel Modélisation Rendu Image Fichier Scène
Advertisements

La boucle for : init7.c et init71.c
Chapitre annexe. Récursivité
Les fonctions A quoi ça sert ?
Cours n° 7 Standard Template Library II.
Introduction. Les pointeurs Bête noir des programmeurs Pas daide de Visual Studio Sauf en utilisant les « break point » Pas toujours intuitif Facile de.
Fonctions & procédures
Lecture et Ecriture.
C.
Exercice 1 1 (père) et 1 (fils) 1 (père) et 0 (fils)
M. BENJELLOUN : Info II Mohammed BENJELLOUN Service dInformatique Faculté Polytechnique de Mons
Paramètres et pointeurs
Fonctions Dans un programme : certaines opérations (ou séquences d'opérations) peuvent se répéter plusieurs fois : affichage de tableau, saisie, ou même.
Les sous-programmes Chapitre n° 5: Objectifs : Activité:
CYCLE 6 : FONCTIONS FONCTIONS avec paramètres en Entrée 1- Pourquoi les FONCTIONS peuvent échanger des données en E entre elles ? 2- Comment écrire des.
ALGORITHMES RECURSIFS
Cours 7 - Les pointeurs, l'allocation dynamique, les listes chaînées
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
Récursivité.
Les algorithmes: complexité et notation asymptotique
La récursivité Une procédure est dite récursive si, et seulement si, elle fait appel à elle-même, soit directement soit indirectement Djamal Rebaïne Djamal.
Introduction à la récursivité
Les tris.
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.
Abder Alikacem Semaine 3 Bâtir un algorithme
Abder Alikacem Semaine 13 La récursivité
Test et débogage Tests unitaires. Gestion d’erreurs. Notion d’état, de pré-condition et de post-condition. Assertion. Traces de programme. Débogueur et.
1 PROTOTYPE PGC++ Vecteur_3D DÉFINITION. 2 class Vecteur_3D { private : float vx, vy, vz, vw; // Représentation en coordonnées homogènes. public : Vecteur_3D();
Chapitre XI Gestion des erreurs et exceptions. 2 La gestion des erreurs et exceptions De nombreux problèmes peuvent survenir pendant lexécution dun programme:
Architecture et technologie des ordinateurs II
1 La récursion. Nous avons vu qu'un programme est constitué d'un ensemble de fonctions. Il est possible pour une fonction donnée d'appeler une autre fonction.
CSI1502 Introduction au génie logiciel
Programme de baccalauréat en informatique Programmation Orientée Objets IFT Thierry EUDE Module 6. Gestion des erreurs et des exceptions : Fonctionnement.
Algorithmique et langage C. Les traitements Comment utiliser les données.
Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009.
INF1101 Algorithmes et structures de données
Procédures et fonctions
FONCTIONS avec paramètres en Entrée/Sortie
III. Récursivité Principe et exemples
Structures de données IFT-2000 Abder Alikacem La récursivité Département d’informatique et de génie logiciel Édition Septembre 2009.
La librairie assert.h.
2.1 - Historique Chapitre 2 : Introduction au langage C++
Notion de fonction A partir d’un exemple Types de fonctions
Sous-programmes.
et quelques rappels sur certains éléments du langage C
8PRO107 Éléments de programmation Les chaînes de caractères.
Algorithmique et langage C. Et me la renvoyer bien sûr… Developpez.com, wiki, siteduzero et autre sont les bienvenus… (les questions sont en orange) C’est.
Argc et argv Utilisation des paramètres de la ligne de commande.
1 Structures des données. 2  Le tableau permettait de désigner sous un seul nom un ensemble de valeurs de même type, chacune d'entre elles étant repérée.
Introduction au langage C Fonctions et Procédures
Novembre 2014J.Callot L.Piedfort1 TP1 Enoncé. novembre 2014J.Callot L.Piedfort2 Objectifs Générer un environnement de travail avec Code Warrior Prendre.
ISBN Chapitre 10 L'implémentation des sous- programmes.
Exercice I Exercice II. Exercice II (suite) Exercice III.
Conception de Programmes - IUT de Paris - 1ère année – Cours 8 – Les entrées/sorties Comment fonctionnent les opérateurs > pour les types élémentaires.
Les algorithmes recursifs
Introduction à la récursivité
1 Les caractères En informatique, les caractères sont très importants puisqu’ils sont utilisés pour la communication personne-machine. Puisque les ordinateurs.
Conception de Programmes - IUT de Paris - 1ère année Cours 2 – Références et passage de paramètres Les Références –Introduction aux références.
Let rec f n = if n = 0 then true else g (n-1) g n = if n = 0 then false else f (n-1) val f : int -> bool = val g : int -> bool =
Conception de Programmes - IUT de Paris - 1ère année Quelques éléments du langage C++ Les références La surcharge de fonctions Les fonctions «
2005/2006 Structures de Données Introduction à la complexité des algorithmes.
La récursivité Mireille Goud HEG Vd AlgSD - Résurisivité.
CPI/BTS 2 Algorithmique & Programmation La récursivité Algo – Prog CPI/BTS2 – M. Dravet – 14/09/2003 Dernière modification: 14/09/2003.
UE MAREP Cours 8 : La pile d’exécution (Fonctions imbriquées et fonctions récursives) Patricia Renault UPMC 2005/2006.
8PRO107 Éléments de programmation Les adresses et les pointeurs.
La récursivité.
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.
Exception Handling "Unfortunately, it's almost accepted practice to ignore error conditions, as if we're in a state of denial about errors." Bruce Eckel.
M. BENJELLOUN : 2005 Le but final est de programmer un jeu où l'ordinateur choisira un nombre aléatoire entre 0 et 100 que vous devez deviner.
Cours de Langage C Récursivité. Objectifs de la séance 11 Connaître la récursivité. Mesurer un temps d’exécution. 2.
Transcription de la présentation:

Récursivité Définition récursive d’un problème. Critère d’arrêt et convergence. Performance des algorithmes récursifs. Résolution d’un problème à l’aide de la récursivité.

Bourgeois gentilhomme (Acte II Scène IV) de Molière Récursivité Bourgeois gentilhomme (Acte II Scène IV) de Molière Le héros, Monsieur Jourdain, veut connaître toutes les manières « galantes » d'écrire un billet. De la phrase Belle Marquise, vos beaux yeux, me font mourir d'amour, il pourrait tirer Vos beaux yeux, belle Marquise, d'amour me font mourir, puis Vos beaux yeux, me font mourir, belle Marquise, d'amour, puis Vos beaux yeux, me font mourir d'amour, belle Marquise etc. Comment Monsieur Jourdain devrait-il procéder pour engendrer toutes ces permutations? Le mieux pour lui pour être sûr d'y arriver est d'utiliser un procédé récursif. On construit toutes les permutations de la phrase vos beaux yeux -- me font mourir -- d'amour; puis, dans ces permutations, on insère en première, deuxième, troisième et quatrième position le morceau de phrase belle Marquise.

Récursivité : générateur de courbes fractales générateur forme initiale arbre fractale

Récursivité Une fonction ou une procédure récursive s’appelle elle-même. Exemple I : Calcul de n! #include <iostream.h> #include <cassert> int Factorielle(int n) // Calcule la factorielle de n. // // Paramètre d'entrée : // n : un entier positif ou nul. // Valeur de renvoi. // la valeur de n! { assert(n >= 0); if (n == 0 || n == 1) return 1; return n * Factorielle(n - 1); }

Récursivité void main() { int n; cout << "Entrez un nombre entier positif ou nul : "; cin >> n; cout << "La factorielle de " << n << " est : " << Factorielle(n) << endl; } Exemple II : Calcul du nième nombre de Fibonacci (Fn). 1 si n = 1 ou 2, Fn = Fn-1 + Fn-2 si n > 2.

Récursivité #include <iostream.h> #include <cassert> int Fibonacci(int n) // Calcule le n ième nombre de Fibonacci. // // Paramètre d'entrée : // n : un entier positif. // Valeur de renvoi. // la valeur du n ième nombre de Fibonacci. { assert(n > 0); if (n == 1 || n == 2) return 1; return Fibonacci(n - 1) + Fibonacci(n - 2); } void main() int n; cout << "Entrez un nombre entier positif : "; cin >> n; cout << "Le " << n << " ieme nombre de Fibonacci est : " << Fibonacci(n) << endl;

Efficacité Dans ces exemples, les fonctions récursives ne sont pas efficaces. n = 47 Mauvais résultat int Fibonacci(int n) { assert(n > 0); int F1 = 1; int F2 = 1; int resultat; if (n == 1 || n == 2) return 1; for (int i = 3; i <= n; i++) resultat = F1 + F2; F1 = F2; F2 = resultat; } return resultat; n = 50 Je n’ai pas réussi à obtenir une réponse avec l’approche récursive. Évite de recalculer plusieurs fois le même nombre. Les appels récursifs sont coûteux.

Efficacité Fibonacci(5) Fibonacci(4) Fibonacci(3) Fibonacci(3) Beaucoup de redondance.

Coûteux en espace mémoire Les fonctions récursives exigent aussi beaucoup d’espaces mémoires. int Essai(int n) // Calcule la sommation suivante : 1 + 2 + ... + n. // // Paramètre d'entrée : // n : un entier positif. // Valeur de renvoi. // la valeur de la sommation. { assert(n > 0); int i; if (n == 1) return 1; i = n + Essai(n - 1); return i; }

Coûteux en espace mémoire Appels successifs Retours d’appels pile pile Essai(1) 1 ? Essai(2) 2 3 Essai(2) 2 ? Essai(3) 3 ? 4 ? 3 ? Essai(4) Essai(3) 4 ? Essai(4) n i Essai(3) 3 6 4 ? Essai(4) 4 10 Essai(4)

Usage d’une pile #include <iostream.h> void Lecture() { char ch; cin >> ch; if (ch != '#') Lecture(); cout << ch; } void main() cout << endl; Affichage d’une chaîne inversée. abc# cba

Stratégie pour résoudre un problème La récursivité peut être utile pour résoudre un problème pouvant être décomposé en sous-problèmes de même type mais de plus petite taille. 3 étapes : Décomposez le problème original en sous-problèmes ou envisagez différentes façons pour simplifier les entrées. Combinaison des solutions des sous-problèmes pour obtenir la solution du problème original. Identification d’un cas trivial et de sa solution (sans appel récursif).

Exemple : la tour de Hanoï Énoncé : n disques de diamètres différents sont posés les uns sur les autres, par ordre de taille décroissante, sur un socle A, il s’agit de les transférer sur le socle B en utilisant le socle C. Déplacements autorisés : prendre un disque au sommet d’une des piles, le poser sur un disque plus grand ou sur un socle vide. A B C État initial

Exemple : la tour de Hanoï Stratégie : Cas trivial : si n est égale à 1 alors déplacer le disque de A dans B. Cas général : Transférer n – 1 disques de A à C en utilisant B comme socle intermédiaire. Déplacer le disque qui reste en A sur B. Transférer les n – 1 disques de C en B en utilisant A comme socle intermédiaire. On dit que le jeu des Tours de Hanoï a pour origine un rituel des prêtres de Brahman pour prédire la fin du monde. Les prêtres de Brahman utilisaient n = 64 disques.

Exemple : la tour de Hanoï #include <iostream.h> void Hanoi(int n, char A, char B, char C) { if (n == 1) cout << "Deplacer le disque " << A << " dans " << B << ".\n"; else Hanoi(n - 1, A, C, B); cout << "Deplacer un disque " << A Hanoi(n - 1, C, B, A); } void main() Hanoi(5, 'A', 'B', 'C'); cout << endl;

Algorithme d’Euclide : PGCD de 2 entiers PGCD(n, m) si n > m PGCD(m, n) = m si n ≤ m, n = 0 PGCD(n, m % n) si n ≤ m, n > 0 #include <iostream.h> #include <cassert> int PGCD( int m, int n) { assert(m != 0 || n != 0); if(n != 0) return PGCD(n, m % n); return m; } void main() int m, n; cin >> m >> n; cout << PGCD(m, n); cout << endl;

Comment déterminer si une chaîne est un palindrome ? Une chaîne égale à elle-même en inversant tous ses caractères. Ex. : rotor #include <iostream.h> #include <string.h> bool est_palindrome(char * s) { int i = strlen(s); if(i <= 1) return true; if(s[0] != s[i-1]) return false; char * raccourci = new char[i-1]; strncpy(raccourci, s+1, i-2); raccourci[i-2] = '\0'; return est_palindrome(raccourci); } void main() char * chaine = "rotor"; cout << est_palindrome(chaine) << endl;

Comment déterminer si une chaîne est un palindrome ? Approche plus élégante. #include <iostream.h> #include <string.h> bool souschaine_est_palindrome(char * s, int debut, int fin) { if (debut >= fin) return true; if(s[debut] == s[fin]) return souschaine_est_palindrome(s, debut+1, fin-1); else return false; } bool est_palindrome(char * s) return souschaine_est_palindrome(s, 0, strlen(s) - 1); void main() char * chaine = "rotor"; cout << est_palindrome(chaine) << endl;