Télécharger la présentation
Publié parMarin Jean Modifié depuis plus de 9 années
1
La récursivité Mireille Goud HEG Vd AlgSD - Résurisivité
2
Rappel sur les fonctions
Prototype : type_retour nom_fonction ( type_arg1 nom_1, type_arg2 nom_2, …, type_argn nom_n) ; AlgSD - Résurisivité
3
Rappel sur les fonctions
Définition de la fonction : type_retour nom_fonction ( type_arg1 nom_1, type_arg2 nom_2, …, type_argn nom_n) { Instructions ; } AlgSD - Résurisivité
4
Arguments de la fonction
Ils sont utilisés dans la fonction comme des variables locales. La valeur des arguments est copiée à l’appel de la fonction dans une zone mémoire allouée pour les arguments et pour les variables locales. Cette zone mémoire est libérée à la fin de la fonction. AlgSD - Résurisivité
5
Définition d’un problème
itératif : défini par répétition d’une même opération. récursif : défini en terme de lui-même (définition par récurrence) AlgSD - Résurisivité
6
Définition Une fonction est récursive si elle s’appelle elle-même.
Une fonction récursive correspond à la définition récursive d’un problème. AlgSD - Résurisivité
7
Calcul de factoriel n Factoriel (n) = 1 si n = 0
= n x (n-1) x (n-2) x …. x 3 x 2 x 1 si n >0 Cette définition de factorielle (n) est dite itérative. AlgSD - Résurisivité
8
Programme itératif int factoriel (int n) { int fact = 1;
for (i = 1 ; i <= n ; i++) { fact = fact * i; } return (fact); AlgSD - Résurisivité
9
Calcul récursif de fact (n)
Factoriel (n) = 1 si n = 0 = n x factorielle (n-1) si n > 0 Cette définition de factorielle (n) est dite récursive. AlgSD - Résurisivité
10
Programme récursif int factorielle (int n) { int res; if (n == 0) {
} else { res = n * factorielle(n-1); } return res; AlgSD - Résurisivité
11
Fonctionnement Fact(3)-> n= 3 ; Res = 3*fact(2) n = 2
Res = 1*fact(0)-> n = return 1; return 1*1; return 2*1; return 3*2; Résultat : 6 AlgSD - Résurisivité
12
Algorithme récursif Test de fin de récursivité : Paramètre :
Résultat : une valeur Fin des appels récursifs Paramètre : Valeur modifiée à chaque appel AlgSD - Résurisivité
13
Utilisation de la récursivité
L’algorithme apparaît dans sa propre définition. La solution récursive plus courte plus lisible. Chaque appel récursif doit soit : résoudre une partie du problème soit réduire la taille du problème. AlgSD - Résurisivité
14
Limite de la récursivité
Certains langages ne supportent pas la récursivité. La récursivité est gourmande en temps et en mémoire, il ne faut l'utiliser seulement si elle apporte un avantage (simplicité) AlgSD - Résurisivité
15
Récursivité et itération
Les fonctions factorielle et Fibonacci ne sont pas de bons exemples d’utilisation de la récursivité Il existe une fonction itérative aussi simple et plus efficace. La récursivité coûte cher en temps CPU et en mémoire AlgSD - Résurisivité
16
Coût d’une itération Création d’un contexte d’exécution (mémoire pour les paramètres et les variables locales) Branchement au début de la fonction Desallocation de la mémoire allouée Retour à la fonction appelante AlgSD - Résurisivité
17
Fibonacci – version itérative
/* Calcule la nieme valeur de Fibonacci */ int fibonaccibis (int n) { int fn, fn_1, fn_2; int i; if (n == 0 || n == 1) { return (n); } else { fn_1 = 0; fn = 1; for (i = 2 ; i <= n; i++) { fn_2 = fn_1; fn_1 = fn; fn = fn_1 + fn_2; } return fn; AlgSD - Résurisivité
18
Suppression de la récursivité
Opération de dérécursivité On écrit d’abord l’algorithme récursif car il est plus facile Technique simple si la récursivité exprime une seule itération Technique difficile dans les autres cas et nécessite l’utilisation de piles AlgSD - Résurisivité
19
Récursivité simple Un seul appel récursif
Appel récursif dans la dernière action de l’algorithme (il n’y a plus d’instructions après cet appel récursif) AlgSD - Résurisivité
20
Récursif vers itératif
Instructions 1 si B alors Instructions 2 Appel récursif (suivant) Finsi tant que (B) faire Passer au suivant finfaire AlgSD - Résurisivité
21
Factorielle Récursif Itératif res <- 1 si (n > 1) alors
res <- n * Fact (n-1) Finsi tant que (n > 1) faire res <- n * res n <- n - 1 finfaire AlgSD - Résurisivité
22
Conclusion Formule récursive plus puissante mais plus coûteuse.
La récursivité complexe est difficile à supprimer. AlgSD - Résurisivité
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.