TUTORIELS 
Comprendre la récursivité

Page 1 | 2

Essentiel en programmation, ce principe de résolution de problèmes permet d'optimiser ses programmes de manière à la fois rapide et élégante. Retour aux bases.
 (9 mai 2003)
 

Récursivité pratique
Plus qu'un simple casse-tête, les fonctions récursives sont un outil qui peut devenir indispensable dans la résolution de certains problèmes de développement. Notamment, elles permettent de grandement simplifier et accélérer un développement qui aurait demandé beaucoup plus de travail s'il avait adopté l'approche itérative. Par exemple, notre routine de factorielle ci-dessous donnerait en itératif:

function fact(x)
  {
  result = 1;
  while( x > 1)
    {
    result = result * x;
    x--;
    }
  return result;
  }

Ce n'est certes guère plus long que la manière récursive, mais c'est surtout considéré comme moins "élégant" dans le cas présent. D'autres cas existent où l'élégance n'est plus de mise, mais l'efficacité. Nombre de problèmes sont résolus en appliquant directement la récursivité, et seraient insolvables (ou difficilement solvable) sans.

Par exemple, la méthode de tri récursif QuickSort est proportionnellement efficace au désordre du tableau à trier. Cela implique, paradoxalement, que cette méthode mettra plus de temps à trier un tableau qui est déjà en parti "rangé" (ou, pire, déjà trié) qu'un tableau rangé au hasard... Mais en cas de désordre intégral, c'est certainement la plus rapide.
Pour simplifier, QuickSort fonctionne en choisissant (au hasard ou non) un point central, ou "pivot", qui est sensé être correctement placé par rapport au tri final. Puis QuickSort est réappliqué aux deux "portions" du tableau séparées par le pivot: on place dans chacun un pivot, et ainsi de suite... A chaque fois, un "tri" est fait: on place d'un coté les éléments inférieurs au pivot, et de l'autre les éléments supérieurs. Au final, on obtient un tableau parfaitement trié.

Autre exemple: le plan du métro. Pour trouver le parcours le plus efficace entre deux stations de métro, c'est la récursivité qui est utilisée: elle permet de parcourir tous les chemins possibles partant d'une station donnée, et de trouver le plus court pour une autre station, en éliminant les chemins qui n'y mènent pas, ceux qui présentent trop de changements et ceux prennent trop de stations pour arriver à destination.

La récursivité permet aussi d'étudier les théories du Chaos... auquel cas on retombe dans le casse-tête.

Les applications sont quasi illimitées: la récursivité est un outil essentiel pour le développeur.

Guide pratique
Lors de la construction de votre fonction récursive, vous devez vous assurez que ces points sont observés:
- la fonction doit être définie de manière conditionnelle: quand elle est appelée, il doit y avoir une vérification de la/des condition(s) d'arrêt. Si elle(s) est/sont satisfaite(s), la récursivité doit s'arrêter.
- au moins l'un des cas de l'expression conditionnelle doit mener à une expression évaluable sans appel récursif.
- chaque fois qu'elle est appelée de manière récursive (par elle-même, donc), un ou plusieurs des arguments qui lui sont transmis doivent se rapprocher de la condition d'arrêt.
- le nombre d'appel récursif pour parvenir à un résultat doit être fini (s'il était infini, on aurait alors une boucle sans fin).
- enfin, et c'est probablement le point le plus important: dans une fonction récursive, la complexité du problème doit être réduite à chaque nouvel appel récursif.

Nous aurons l'occasion prochainement de voir de manière plus complète des applications de la récursivité...

Page 1 | 2

 
[ Xavier Borderie,JDNet
 
Accueil | Haut de page