La récursivité et les boucles sont deux outils fondamentaux pour implémenter des tâches répétitives en programmation. Alors que les boucles comme for et while sont intuitives pour la plupart des développeurs, la récursivité offre une approche plus abstraite et flexible de la résolution de problèmes. Cet article explore comment convertir des boucles en fonctions récursives, fournit des modèles généraux et explique le concept et l'optimisation de la récursion de queue.
La récursion est une technique dans laquelle une fonction s'appelle pour résoudre des instances plus petites du même problème. Ce comportement autoréférentiel se poursuit jusqu'à ce qu'une condition de base spécifiée soit remplie.
Par exemple, calculer la factorielle d'un nombre par récursion :
function factorial(n) { if (n <= 1) return 1; // Base case return n * factorial(n - 1); // Recursive case }
Dans cet exemple, factorial(n - 1) réduit la taille du problème à chaque appel, se terminant finalement lorsque n vaut 1.
Pour convertir des boucles en récursivité, suivez ces étapes :
function recursiveFunction(iterationState, dataOrAccumulator) { // Base case: Define when recursion stops if (baseCondition(iterationState)) { return dataOrAccumulator; // Final result } // Perform the action for the current iteration const updatedData = updateAccumulator(dataOrAccumulator, iterationState); // Recursive call with updated state return recursiveFunction(updateIterationState(iterationState), updatedData); }
Utiliser une boucle :
function sumArray(arr) { let sum = 0; for (let i = 0; i < arr.length; i++) { sum += arr[i]; } return sum; }
Utilisation de la récursivité :
function sumArrayRecursive(arr, index = 0) { if (index >= arr.length) return 0; // Base case return arr[index] + sumArrayRecursive(arr, index + 1); // Recursive case }
Utiliser une boucle :
function countdown(n) { while (n > 0) { console.log(n); n--; } }
Utilisation de la récursivité :
function countdownRecursive(n) { if (n <= 0) return; // Base case console.log(n); // Current iteration work countdownRecursive(n - 1); // Recursive case }
La récursion de queue est une forme spéciale de récursion où l'appel récursif est la dernière opération de la fonction. Cela signifie qu'aucun calcul supplémentaire n'a lieu après le retour de l'appel récursif.
Exemple de récursion de queue :
function factorialTailRecursive(n, accumulator = 1) { if (n <= 1) return accumulator; // Base case return factorialTailRecursive(n - 1, accumulator * n); // Tail-recursive call }
Exemple de récursion sans queue :
function factorial(n) { if (n <= 1) return 1; // Base case return n * factorial(n - 1); // Recursive case }
Pour écrire des fonctions récursives de queue, suivez ce modèle :
function recursiveFunction(iterationState, dataOrAccumulator) { // Base case: Define when recursion stops if (baseCondition(iterationState)) { return dataOrAccumulator; // Final result } // Perform the action for the current iteration const updatedData = updateAccumulator(dataOrAccumulator, iterationState); // Recursive call with updated state return recursiveFunction(updateIterationState(iterationState), updatedData); }
function sumArray(arr) { let sum = 0; for (let i = 0; i < arr.length; i++) { sum += arr[i]; } return sum; }
function sumArrayRecursive(arr, index = 0) { if (index >= arr.length) return 0; // Base case return arr[index] + sumArrayRecursive(arr, index + 1); // Recursive case }
La conversion de boucles en récursivité est une technique puissante qui permet d'obtenir un code plus abstrait et flexible. En comprenant et en appliquant des modèles de récursion, les développeurs peuvent remplacer les constructions itératives par des solutions récursives. L'exploitation de la récursion de queue améliore encore les performances et réduit le risque de débordement de pile, à condition que l'environnement prenne en charge l'optimisation des appels de queue.
La maîtrise de ces concepts ouvre la porte à la résolution d'un plus large éventail de problèmes de manière efficace et élégante.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!