Ah, le gros mot! Récursion! L’idée est pourtant toute simple, un processus qui se répète lui-même. Et le but, simplifier jusqu’à augmenter dans certains cas l’efficacité et la rapidité d’exécution du code. Au grand bonheur des puriste. Mais voilà, la récursion rebute, elle a un petit quelque chose de magique! Un concept simple sur papier difficile à reproduire en pensé qui s’apparente souvent à l’illumination! C’est aussi un processus qui requiert son propre système de pile (stack) en mémoire jugé par certains trop gourmand pour la peine! Car en principe, tout algorithme récursif peut être reproduit de façon itérative. C’est à dire avec la bonne vielle boucle.
Récursif versus itératifs (Mise à jour 2014)
Aussi vieux que l’ordinateur lui-même, cette polémique n’a plus aucune raison d’être. On a même plusieurs cœur maintenant ; -) Les machines, les systèmes d’exploitation et les compilateurs sont tellement puissant aujourd’hui que que l’argument tient difficilement la route. La philosophie du Web où chaque poste exécute, interprété et manipule des données partagé en est un bon exemple. Le Javascript ou carrément le XSL, basé sur la récursion.
Reste à construire l’algorithme. Ou plutôt à déconstruire le problème! À l’instar du fractal, la fonction récursive est avant tout une solution à un petit problème! Comme dans l’exemple de l’arbre binaire, le problème est « le nœud et ses deux enfants ». Et la solution s’appliquera à chaque nœud de l’arbre, à l’infini s’il le faut.
Une fonction récursive est une fonction qui s’appelle elle même. Dans sa plus simple expression elle s’exécutera en boucle à l’infini. Il faut prévoir en sortir et c’est ici que ça se corse! Peut importe la méthode, une condition à la récursion, un test de condition... là n’arrête pas la récursion pour autant! En effet les processus en cours, dit « actif », stockés dans une pilè (stack) dédié aux fonctions récursives seront part Les processus en cours reviens en arrière, processus
On appelle une fonction avant même d’avoir terminé ses instructions. Si le rappel est la dernière instruction, on dit qu’elle est une « fonction récursive de queue (tail). Basées sur la pile, les fonctions récursives emmagasine en empilant l’"état actif" d’une passe (boucle) d’une fonction. une au dessus de l’autre et alimente à partir de celle-ci la pile (stack) de la mémoire.
En mathématique, la valeur factorielle d’un nombre positif n est représenté par cette formule : n! = n . (n-1) . (n-2) . (n-3) ... 1
C’est-à-dire que le factoriel de notre nombre n est le produit de ce nombre, n, avec tous les nombres qui lui sont plus petit, jusqu’à 1. Donc, 5! c’est en fait 5x4x3x2x1.La deuxième forme est dite une forme récursive, car elle utilise sa propre opération pour se définir. Voici ces deux formes de la fonction "factoriel" en code ASP.
La solution simple avec le nombre 5
<% Response.Write Factoriel (5) Function Factoriel ( intNombre ) Dim intCount, intFactoriel intFactoriel = 1 For intCount = intNombre To 1 Step -1 intFactoriel = intFactoriel * intCount Next Factoriel = intFactoriel End Function %>
Solution récursive
<% Response.Write FactorielRecursif (5) Function FactorielRecursif (intNombre ) If intNombre <= 1 Then FactorielRecursif = 1 Else FactorielRecursif = intNombre * FactorielRecursif (intNombre - 1 ) End If End Function %>
Explication de la forme récursive : SI le nombre "intNombre" est plus petit ou égal à 1, alors la fonction retournera 1 SINON la valeur retournée sera le produit du nombre "intNombre" avec la valeur retournée par la fonction pour le nombre "intNombre -1".
Résultat: 5! = 5 . (5-1) . (5-2) . (5-3) . (5-4)
Simplifié: 5! = 5 . 4 . 3 . 2. 1 = 120