La récursivité Mireille Goud HEG Vd AlgSD - Résurisivité
Rappel sur les fonctions Prototype : type_retour nom_fonction ( type_arg1 nom_1, type_arg2 nom_2, …, type_argn nom_n) ; AlgSD - Résurisivité
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é
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é
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é
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é
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é
Programme itératif int factoriel (int n) { int fact = 1; for (i = 1 ; i <= n ; i++) { fact = fact * i; } return (fact); AlgSD - Résurisivité
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é
Programme récursif int factorielle (int n) { int res; if (n == 0) { } else { res = n * factorielle(n-1); } return res; AlgSD - Résurisivité
Fonctionnement Fact(3)-> n= 3 ; Res = 3*fact(2) n = 2 Res = 1*fact(0)-> n = 0 return 1; return 1*1; return 2*1; return 3*2; Résultat : 6 AlgSD - Résurisivité
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é
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é
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é
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é
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é
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é
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é
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é
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é
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é
Conclusion Formule récursive plus puissante mais plus coûteuse. La récursivité complexe est difficile à supprimer. AlgSD - Résurisivité