Récursivité dans l'algorithmique et la programmation/Algorithmes récursifs

Leçons de niveau 13
Une page de Wikiversité, la communauté pédagogique libre.
Début de la boite de navigation du chapitre
Algorithmes récursifs
Icône de la faculté
Chapitre no 2
Leçon : Récursivité dans l'algorithmique et la programmation
Chap. préc. :Introduction
Chap. suiv. :Structure de données récursives

Exercices :

Algorithmes récursifs
fin de la boite de navigation du chapitre
En raison de limitations techniques, la typographie souhaitable du titre, « Récursivité dans l'algorithmique et la programmation : Algorithmes récursifs
Récursivité dans l'algorithmique et la programmation/Algorithmes récursifs
 », n'a pu être restituée correctement ci-dessus.

On peut distinguer plusieurs catégories d'algorithmes récursifs en considérant


  • Le mode d'appel : direct/indirect
  • Le nombre de paramètres sur lesquels porte la récursion : arité
  • Le nombre d'appels récursifs : ordre de récursion
  • Le genre de retour : terminal/non terminal

Mode d'appel[modifier | modifier le wikicode]

Comme nous l'avons déjà vu dans l'introduction, un algorithme récursif qui dans son corps s’appelle lui-même est dit direct. L'exemple de la factorielle est trivial. Un algorithme récursif est dit indirect s'il est défini par un ensemble de fonctions qui s'appellent en chaîne.

Début de l'exemple
Fin de l'exemple


Arité[modifier | modifier le wikicode]

L'arité d'un algorithme est le nombre de paramètres d'entrée. Un algorithme récursif peut effectuer des appels récursifs en modifiant un nombre quelconque non nul de ses paramètres. Dans l'exemple de la fonction factorielle, l'algorithme prend un paramètre d'entrée et le modifie lors des appels récursifs. Dans le cas de la puissance entière (proposé en exercice), l'algorithme prend deux entrées, la base et l'exposant. Dans les appels récursifs seul l'exposant est modifié. Voici un exemple de récursion sur deux paramètres.

Début de l'exemple
Fin de l'exemple


Ordre de récursion[modifier | modifier le wikicode]

Jusqu'à présent, tous les algorithmes récursifs évoqués ne font qu'un appel récursif à la fois, c'est-à-dire que pour déterminer la valeur d'un appel, on n'a besoin que d'un appel récursif. Ces algorithmes sont dits d'ordre 1. Certains algorithmes font plusieurs appels récursifs, comme la version naïve du calcul de la suite de Fibonnaci. Celle-ci doit faire deux appels récursifs, une fois avec le paramètre n-1 et une seconde fois avec le paramètre n-2 pour calculer une valeur de retour. C’est un algorithme récursif d'ordre 2.

Début de l'exemple
Fin de l'exemple


Récursion terminale[modifier | modifier le wikicode]

Pour déterminer si un algorithme est terminal, il faut regarder comment il génère les valeurs de retour. Si ce sont soit des constantes, soit des valeurs directement issue d'un appel récursif, sans aucune autre modification, alors l'algorithme est dit terminal. Dans le cas contraire, il sera dit non-terminal. Cette notion est importante si l’on veut déterminer une version itérative de l'algorithme concerné. Dans les exemples précédents, factorielle est non terminal car, bien que le cas d'arrêt renvoie une constante, celui de l'appel récursif quant à lui modifie la valeur renvoyée en la multipliant par n avant de lui-même renvoyer une valeur.