



Study with the several resources on Docsity
Earn points by helping other students or get them with a premium plan
Prepare for your exams
Study with the several resources on Docsity
Earn points to download
Earn points by helping other students or get them with a premium plan
Cours de Algo de Mme Elouedi Hind pour L1-TI
Typology: Study notes
1 / 6
This page cannot be seen from the preview
Don't miss anything!




Objectif général Résoudre des problèmes définis récursivement.
I.1 Définition La récursivité est un concept très puissant si on arrive à décomposer un problème en un ou plusieurs sous-problèmes qui sont de même nature. Il est de même quand on décompose un objet en groupes de composants qui présentent les mêmes propriétés et qui ne contiennent qu'un sous-ensemble de l'objet. Une notion est dite récursive si elle, entre, elle même dans sa composition ou dans sa définition. Exemples « Mon ascendant est mon père, ma mère ou un de leurs ascendants » De même, un algorithme est dit récursif s’il fait appel à lui-même. Ainsi, la fonction factorielle : n! = (n-1)! * n Cette expression ne fait que déplacer le problème de l’ordre n à l’ordre n-1, sans le résoudre. Par bonheur, en faisant ainsi décroître l’ordre, on parvient à une relation sans indétermination : 1! = 1 (ou éventuellement (0! = 1). Grâce à cette propriété, le traitement récursif de la factorielle n’est pas un cercle vicieux. Son algorithme s’écrit : « Algorithme Récursif » « Algorithme Itératif » Factorielle ( Don n : Entier ) : Entier
Début Si (n 1) Alors Factorielle 1 Fonction Sinon Factorielle n * Factorielle (n-1) FinSi Fin Fonction Factorielle ( Don n : Entier ) : Entier
Variable Resultat : Entier Début Resultat 1 Pour i de 1 à n Faire Resultat Resultat * i FinPour Factorielle Résultat Fin Les entiers naturels sont définis d’une manière récursive par deux règles : 0 est un entier naturel. Le successeur d'un entier naturel est un entier naturel. La définition récurrente des suites mathématiques : U 0 = 1 Un = aUn- 1 + b Les chaînes de caractères sont définies récursivement - Une chaîne de caractères est soit : Une chaîne vide, soit, Un caractère suivi d'une chaîne.
I.2. types de récursivité Il existe deux types de récursivité : La récursivité des objets : Entiers naturels, chaînes de caractères,... La récursivité des traitements ou des actions : Factorielle, suites,... Au niveau de ce chapitre, on s’intéressera à la récursivité des actions, elle se base sur l'utilisation de la notion de module (procédures et fonctions). Il existe deux types de récursivité des actions : Récursivité directe : Une action est directement récursive si son corps présente un ou plusieurs appels à l'action elle-même. Récursivité indirecte : Une action est indirectement récursive si son exécution peut entraîner indirectement un ou plusieurs appels à l'action elle-même. I.3. notions de base Exemple Reprenons l’exemple de la fonction Factorielle , on a : n! = n * (n-1)!. On peut remarquer que, dans le cas de la récursivité, il est nécessaire de conserver en mémoire les expressions intermédiaires non résolues dans ce qu’on appelle une pile. Une fois parvenue à la propriété 1! = 1, ces expressions seront dépilées et résolues. Analysons la pile en appelant Factorielle (3) : n = 1 n = 2 n = 2 n = 2 n = 3 n = 3 n = 3 n = 3 n = 3 Etat initial (a)^ (b)^ (c)^ (d)^ (e)^ Etat final (a) Premier appel de Factorielle (3) , on affecte au paramètre n la valeur 3. Comme (n > 1) on calcule n * Factorielle (n-1) : n = 3, n-1 = 2 on appelle alors Factorielle (2) (b) Deuxième appel, n prend la valeur 2, n >1, on appelle Factorielle (1) (c) Troisième appel, on affecte à n la valeur 1, la condition (n>1) n’est plus vérifiée, donc on quitte la fonction, on libère la pile de son sommet, on retourne où la fonction Factorielle (1) a été appelée en retournant la valeur 1. (d) on peut maintenant calculer n * Factorielle (1) , n (sommet de la pile) vaut 2, Factorielle (1) vaut 1, on peut retourner 2, puis on dépile n. (e) on peut calculer n * Factorielle (2) , n vaut 3 (sommet de la pile), Factorielle (2) vaut 2, 3 * 2 = 6, on retourne 6, la pile est vidée et retrouve son état initial. Notion d'environnement : Il est formé par l'ensemble de données (variables et paramètres) utilisées par un module lors d'une exécution. Chaque fois que le module est appelé récursivement, un nouvel environnement est généré, un nouvel ensemble de variables locales et de paramètres est créé. Bien qu'elles portent le même nom que celles créées à l'appel précédent, leurs valeurs sont différentes et on utilise toujours le dernier jeu de variables créé. Cet environnement est détruit lorsque l'exécution prend fin. Si un module appelle un autre module sans que son exécution ne soit terminée, l'environnement du premier est suspendu et il sera réactivé lorsque l'exécution du second sera terminée. L’ensemble des environnements existant pour une exécution (suspendus ou actif) forme ce qu’on appelle une pile d’environnement.
Figure 7.1 : Arbre d’exécution (Trace) de la fonction Fibo (4) Pour éviter la redondance de traitements, on peut envisager l’écriture de la version itérative de la fonction Fibo : Fonction Fibo ( Don n : Entier ) : Entier Variable i, x, y, z : Entier Début Si (n = 0 Ou n =1) Alors Fibo n Sinon x 0 y 1 i 2 TantQue (i n) Faire z x + y x y y z i i + 1 FinTantQue Fibo z FinSi Fin II.2. Solution itérative non évidente Dans ce cas, la solution itérative n’est pas évidente, alors que l’action est définie récursivement. Exemple Soit la fonction d' Ackermann définie pour tous les entiers positifs m et n de la manière suivante : Acker (0,n) = n + 1 Acker (m,0) = Acker (m-1,1) pour m 1 Acker (m,n) = Acker(m-1, Acker (m,n-1)) pour m 1 et n 1
Fonction Acker ( Don m : Entier , Don n : Entier ) : Entier Début Si (m = 0) Alors Acker n + 1 Sinon Si (n = 0) Alors Acker Acker (m-1,1) Sinon Acker Acker (m-1, Acker (m, n-1)) FinSi FinSi Fin II.3. Définition d’algorithmes récursifs La définition des algorithmes récursifs comporte trois étapes : Etape 1 : Paramétrage du problème : On doit faire apparaître tous les paramètres dont la solution dépend. On doit définir la taille du problème à résoudre qui doit décroître à chaque appel récursif. Etape 2 : Recherche d'un cas trivial ainsi que sa solution : C'est l'étape clé de l'algorithme. Etape 3 : Décomposition du cas général : Le but est de ramener le problème à un ou plusieurs problèmes de taille inférieure.
III.1. Définition du problème L’exemple le plus classique pour illustrer la méthode récursive est celui des Tours de Hanoï : N disques sont empilés par ordre de diamètre décroissant (tous les disques sont de diamètres différents ) sur un piquet A. Deux autres piquets B et C peuvent recevoir des disques, à condition que ceux-ci soient toujours empilés selon la même règle du diamètre décroissant. Le but du jeu est de transporter les N disques du piquet A au piquet C , en utilisant éventuellement le piquet B , tout en respectant les deux règles suivantes : Ne déplacer qu’ un seul disque à la fois. Ne placer un disque que sur un disque de diamètre supérieur, ou un piquet libre. III.2. Démarche récursive Paramétrage du problème N : nombre de disques A, B, C : les piquets (départ, intermédiaire et arrivée). Recherche de la valeur d’arrêt Si (N = 1) Alors « Déplacer un disque de A vers C » : Déplacer (A, C) Décomposition du cas général Résoudre le problème pour N disques ne présente pas de difficulté si on sait le résoudre pour ( N- 1 ) disques ; en effet, transporter les N disques du piquet A au piquet C , c’est : Transporter les (N-1) premiers disques de A vers B (C piquet intermédiaire), puis Déplacer le disque restant de A vers C, et enfin, Transporter les (N-1) disques de B vers C (A piquet intermédiaire).