la Récursion en JavaScript : (Les Fonctions récursives)
La récursion est une technique indispensable en programmation, et JavaScript, en tant que langage moderne, la supporte pleinement.
Comment maitriser la récursion ? Pour résoudre des problèmes complexes avec simplicité.
Voici comment cette article vous aidera à comprendre les concepts de base, les avantages et les applications pratiques de la récursion et des fonctions récursives en JavaScript.
Qu’est-ce que la Récursion ?
La récursion est une méthode où une fonction s’appelle elle-même pour accomplir une tâche. Pour que cette technique soit efficace, la fonction doit répondre à deux conditions essentielles :
- Cas de base : Une condition qui arrête les appels récursifs.
- Cas récursif : La partie de la fonction qui se rappelle elle-même avec des paramètres modifiés.
La récursion est comme une boucle, mais elle est gérée par des appels de fonction. Une fonction récursive s’appelle elle-même pour résoudre un problème en petits morceaux.
Exemple simple de base : Compter à Rebours
Imaginons une fonction qui compte à rebours depuis un nombre donné jusqu’à 1.
function countDown(n) {
if (n <= 0) { // Cas de base
console.log("Terminé !");
return; // Arrête la fonction
}
console.log(n); // Affiche le nombre actuel
countDown(n - 1); // Appel récursif avec n-1
}
countDown(5); // Affiche 5, 4, 3, 2, 1, puis "Terminé !"
Explication :
- La fonction
countDown
vérifie si le nombre est inférieur ou égal à 0. Si c’est le cas, elle affiche « Terminé ! » et arrête la fonction. - Sinon, elle affiche le nombre et appelle
countDown
avec le nombre diminué de 1. - La fonction continue à s’appeler jusqu’à ce que le nombre atteigne 0.
Exemple suivant : Calculer la Factorielle
La factorielle d’un nombre est le produit de tous les entiers positifs jusqu’à ce nombre. Par exemple, la factorielle de 4 est 4 × 3 × 2 × 1 = 24.
function factorial(n) {
if (n === 0) { // Cas de base
return 1;
}
return n * factorial(n - 1); // Appel récursif
}
console.log(factorial(4)); // Affiche 24
Explication :
- La fonction
factorial
vérifie sin
est égal à 0. Si oui, elle renvoie 1 (car 0! = 1). - Sinon, elle renvoie
n
multiplié par la factorielle den - 1
. - La fonction s’appelle elle-même avec des valeurs décroissantes jusqu’à atteindre 0.
En mathématiques, la factorielle d’un nombre entier positif
Par exemple, pour calculer la factorielle de 5, notée
5!, vous multipliez tous les entiers de 1 à 5 :
5!=5×4×3×2×1=120
Cette fonction fonctionne en multipliant le nombre courant n par la factorielle de n−1 , jusqu’à atteindre 0, où la factorielle est définie comme 1.
Applications
La factorielle est utilisée dans divers domaines des mathématiques, y compris les probabilités, la combinatoire et l’analyse algorithmique, pour compter les arrangements possibles, les permutations, et plus encore.
Pourquoi Utiliser la Récursion ?
La récursion est très utile pour les problèmes qui peuvent être divisés en sous-problèmes similaires. Elle rend le code plus propre et plus facile à comprendre pour ces cas spécifiques.
Exemple Simple : Additionner des Nombres
Supposons que nous voulons additionner tous les nombres de 1 à n.
function sum(n) {
if (n === 1) { // Cas de base
return 1;
}
return n + sum(n - 1); // Appel récursif
}
console.log(sum(3)); // Affiche 6 (3 + 2 + 1)
Explication :
- La fonction
sum
ajouten
au résultat desum(n - 1)
. - Cela continue jusqu’à ce que
n
soit 1, auquel cas la fonction renvoie 1.
Voici D’autres Fonctions Récursives en JavaScript
Les fonctions récursives sont utiles pour résoudre des problèmes où une tâche peut être divisée en sous-tâches similaires. Voici quelques exemples classiques :
Fibonacci
La suite de Fibonacci est une série de nombres où chaque nombre est la somme des deux précédents. Cette fonction calcule le n-ième nombre de la suite de Fibonacci.
function fibonacci(n) {
if (n <= 1) { // Cas de base
return n;
}
return fibonacci(n - 1) + fibonacci(n - 2); // Cas récursif
}
console.log(fibonacci(6)); // Affiche 8 (la suite est 0, 1, 1, 2, 3, 5, 8, ...)
Calcul de Puissance
Le calcul de la puissance d’un nombre peut être optimisé en utilisant la récursion, particulièrement utile pour des puissances élevées.
function power(base, exponent) { if (exponent === 0) { // Cas de base return 1; } return base * power(base, exponent - 1); // Cas récursif } console.log(power(2, 3)); // Affiche 8 (2^3)
Inversion d’une Chaîne de Caractères
Inverser une chaîne de caractères est un problème classique qui peut être résolu de manière récursive.
function reverseString(str) { if (str === "") { // Cas de base return ""; } return reverseString(str.substr(1)) + str.charAt(0); // Cas récursif } console.log(reverseString("recursion")); // Affiche "noisrucer"
Calcul du PGCD (Plus Grand Commun Diviseur)
Le plus grand commun diviseur de deux nombres peut être calculé de manière récursive en utilisant l’algorithme d’Euclide.
function gcd(a, b) { if (b === 0) { // Cas de base return a; } return gcd(b, a % b); // Cas récursif } console.log(gcd(48, 18)); // Affiche 6
Compter les Occurrences d’un Caractère dans une Chaîne
Cette fonction compte combien de fois un caractère donné apparaît dans une chaîne.
function countOccurrences(str, char) { if (str.length === 0) { // Cas de base return 0; } let count = (str.charAt(0) === char) ? 1 : 0; return count + countOccurrences(str.substr(1), char); // Cas récursif } console.log(countOccurrences("recursion", "r")); // Affiche 2
Trouver le Plus Petit Élément d’un Tableau
Voici une fonction récursive pour trouver le plus petit élément d’un tableau.
function findMin(arr, n) { if (n === 1) { // Cas de base return arr[0]; } return Math.min(arr[n - 1], findMin(arr, n - 1)); // Cas récursif } const numbers = [5, 3, 7, 1, 4]; console.log(findMin(numbers, numbers.length)); // Affiche 1
Les grands classiques comme la Tour de Hanoï
Le problème des Tours de Hanoï est un casse-tête mathématique où vous avez trois tiges et un certain nombre de disques de tailles différentes.
Tous les disques commencent sur la première tige, empilés par ordre de taille décroissante. Le but est de déplacer tous les disques vers la troisième tige en respectant les règles suivantes :
- Vous ne pouvez déplacer qu’un seul disque à la fois.
- Un disque ne peut être placé que sur un disque plus grand.
- Vous devez utiliser les trois tiges.
Solution Récursive
La récursion est une méthode idéale pour résoudre ce problème, car chaque mouvement peut être considéré comme un sous-problème plus petit.
Explication de la Fonction hanoi
Voici la fonction en question :
function hanoi(disque, tigeSource, tigeDestination, tigeAuxiliaire) { if (disque === 1) { // Cas de base console.log(`Déplacer le disque 1 de ${tigeSource} à ${tigeDestination}`); return; } // Déplacer disque-1 disques de la tige source à la tige auxiliaire hanoi(disque - 1, tigeSource, tigeAuxiliaire, tigeDestination); // Déplacer le disque restant vers la tige destination console.log( `Déplacer le disque ${disque} de ${tigeSource} à ${tigeDestination}` ); // Déplacer les disque-1 disques de la tige auxiliaire à la tige destination hanoi(disque - 1, tigeAuxiliaire, tigeDestination, tigeSource); } // Exemple avec 3 disques hanoi(3, 'A', 'C', 'B');
1. Cas de Base : disque === 1
Le cas de base dans la récursion est la condition qui met fin à l’appel récursif. Ici, le cas de base est lorsque disque === 1
, c’est-à-dire qu’il ne reste qu’un seul disque à déplacer.
if (disque === 1) { console.log(`Déplacer le disque 1 de ${tigeSource} à ${tigeDestination}`); return; }
- Quand cette condition est vraie : La fonction imprime simplement le déplacement du disque 1 de la tige source vers la tige destination.
- Pourquoi c’est important : Cela empêche la récursion de continuer indéfiniment et définit le comportement pour le plus petit sous-problème possible (déplacer un seul disque).
2. Déplacer disque - 1
Disques de la Tige Source à la Tige Auxiliaire
hanoi(disque - 1, tigeSource, tigeAuxiliaire, tigeDestination);
- Que fait cette ligne ? : La fonction appelle
hanoi
pour déplacer lesdisque - 1
disques du haut de la tige source vers la tige auxiliaire. La tige destination devient temporairement la tige auxiliaire pour cette opération. - Pourquoi c’est important ? : Cette étape est cruciale car elle déplace tous les disques sauf le plus grand (le disque actuel) sur la tige auxiliaire, libérant ainsi la tige source pour déplacer le plus grand disque directement vers la tige destination.
3. Déplacer le Disque Actuel de la Tige Source à la Tige Destination
console.log(`Déplacer le disque ${disque} de ${tigeSource} à ${tigeDestination}`);
- Que fait cette ligne ? : Elle imprime l’instruction pour déplacer le disque actuel (le plus grand des disques restants) de la tige source vers la tige destination.
- Pourquoi c’est important ? : Après avoir déplacé les
disque - 1
disques plus petits vers la tige auxiliaire, vous pouvez maintenant déplacer le plus grand disque directement vers la tige destination.
4. Déplacer les disque - 1
Disques de la Tige Auxiliaire à la Tige Destination
hanoi(disque - 1, tigeAuxiliaire, tigeDestination, tigeSource);
- Que fait cette ligne ? : La fonction appelle
hanoi
pour déplacer lesdisque - 1
disques qui se trouvent maintenant sur la tige auxiliaire vers la tige destination, en utilisant la tige source comme tige auxiliaire temporaire. - Pourquoi c’est important ? : Cela complète le transfert en déplaçant tous les disques (sauf le plus grand) de la tige auxiliaire à la tige destination, empilant ainsi les disques correctement sur la tige destination.
Exécution avec 3 Disques
Examinons ce qui se passe lorsque la fonction est appelée avec 3 disques :
hanoi(3, "A", "C", "B");
Appel initial :
hanoi(3, "A", "C", "B")
- Déplace les 2 premiers disques de A à B en utilisant C comme auxiliaire.
- Déplace le disque 3 de A à C.
- Déplace les 2 disques de B à C en utilisant A comme auxiliaire.
Premier appel récursif :
hanoi(2, "A", "B", "C")
- Déplace le disque 1 de A à C.
- Déplace le disque 2 de A à B.
- Déplace le disque 1 de C à B.
Deuxième appel récursif :
hanoi(1, "A", "C", "B")
- Déplace le disque 1 de A à C.
Déplacement principal : Déplacer le disque 3 de A à C.
Troisième appel récursif :
hanoi(2, "B", "C", "A")
- Déplace le disque 1 de B à A.
- Déplace le disque 2 de B à C.
- Déplace le disque 1 de A à C.
Cette fonction hanoi
est un excellent exemple de la puissance de la récursion pour résoudre des problèmes complexes par une approche diviser pour régner.
En décomposant le problème en sous-problèmes plus petits (ici en déplaçant les disque - 1
disques), la solution finale est obtenue de manière élégante et structurée.
Conclusion :
Les fonctions récursives comme celles présentées ici sont non seulement utiles, mais aussi extrêmement puissantes pour résoudre des problèmes qui se prêtent bien à une décomposition en sous-problèmes similaires.
La Tour de Hanoï est un excellent exemple, illustrant comment une solution récursive peut décomposer un problème complexe en étapes simples et répétitives.
Améliore tes compétences dans l’apprentissage de JavaScript pour cela :
Je t’offre un Guide Bonus Exclusif
En allant plus loin, avec ce Guide Bonus Exclusif rien que pour Toi !
Voici un guide complet sur le JavaScript, où tu verras des techniques pour performer en programmation Js.
Ce guide te permettra de perfectionner tes compétences et de devenir un expert JavaScript. Ne le rate pas et développe ton expertise !
En adoptant ce qu’il contient, tu rends ton apprentissage de JavaScript plus performant avec une plus grande facilité tous les jours . Voici de quoi enrichir tout de suite ton savoir-faire ? Le guide complet t’attend !
Quelques liens en supplément de ce cours :
https://developpeur-pro.com/cours-javascript-les-bases
Rejoignez notre Newsletter et Restez Informé !
Vous souhaitez rester à jour avec les dernières tendances et actualités du monde du développement et le métier de développeur. Comment devenir développeur pro ? Rejoignez notre newsletter pour obtenir un accès exclusif à du contenu premium, des astuces de codage, des mises à jour sur les nouvelles fonctionnalités et bien plus encore !
Avantages de l’Inscription
- Restez Informé: Recevez des articles informatifs sur les dernières avancées et les meilleures pratiques de codage et les softkills.
- Promos Exclusives: Accédez à des formations détaillés et à des exemples de code pour améliorer vos compétences en programmation.
- Aperçus des Nouveautés: Soyez parmi les premiers à découvrir les nouvelles fonctionnalités et les frameworks émergents dans l’écosystème du développement FrontEnd et Backend.
- Communauté Engagée: Rejoignez une communauté passionnée de développeurs et partagez vos idées, questions et expériences.
Comment S’Inscrire
C’est simple et rapide ! Remplissez le formulaire d’inscription avec votre adresse e-mail et cliquez sur « S’Inscrire ». Vous recevrez régulièrement notre newsletter dans votre boîte de réception.
L’inscription à notre newsletter est un moyen idéal de rester informé et de progresser dans le domaine de la programmation et du développement pour devenir un développeur professionnel ou une développeuse pro.