Cela dépend de la langue utilisée. Vous avez écrit "language-agnostic", je vais donc vous donner quelques exemples.
En Java, C et Python, la récursion est assez coûteuse par rapport à l'itération (en général) car elle nécessite l'allocation d'un nouveau cadre de pile. Dans certains compilateurs C, on peut utiliser un drapeau de compilation pour éliminer cette surcharge, ce qui transforme certains types de récursion (en fait, certains types d'appels de queue) en sauts au lieu d'appels de fonction.
Dans les implémentations des langages de programmation fonctionnelle, l'itération peut parfois être très coûteuse et la récursion très bon marché. Dans beaucoup, la récursion est transformée en un simple saut, mais en changeant la variable de la boucle (qui est mutable) parfois nécessite des opérations relativement lourdes, en particulier sur les implémentations qui prennent en charge plusieurs threads d'exécution. La mutation est coûteuse dans certains de ces environnements en raison de l'interaction entre le mutateur et le ramasseur de déchets, si les deux peuvent être exécutés en même temps.
Je sais que dans certaines implémentations de Scheme, la récursion est généralement plus rapide que le bouclage.
En bref, la réponse dépend du code et de l'implémentation. Utilisez le style que vous préférez. Si vous utilisez un langage fonctionnel, la récursion pourrait être plus rapide. Si vous utilisez un langage impératif, l'itération est probablement plus rapide. Dans certains environnements, les deux méthodes aboutiront à la génération du même assemblage (mettez cela dans votre pipe et fumez-le).
Addendum : Dans certains environnements, la meilleure alternative n'est ni la récursion ni l'itération, mais plutôt les fonctions d'ordre supérieur. Il s'agit notamment de "map", "filter" et "reduce" (qui est également appelé "fold"). Non seulement ces fonctions sont le style préféré, non seulement elles sont souvent plus propres, mais dans certains environnements, ces fonctions sont les premières (ou les seules) à bénéficier de la parallélisation automatique - elles peuvent donc être nettement plus rapides que l'itération ou la récursion. Data Parallel Haskell est un exemple d'un tel environnement.
Les compréhensions de listes sont une autre alternative, mais elles ne sont généralement que du sucre syntaxique pour l'itération, la récursion ou les fonctions d'ordre supérieur.
5 votes
Il faut parfois des siècles pour trouver des procédures itératives ou des formules en forme fermée pour certaines récurrences. Je pense que c'est seulement dans ces moments-là que la récursion est plus rapide :) lol
53 votes
En ce qui me concerne, je préfère de loin l'itération ;-)
0 votes
Duplication possible de Récursion ou itération ?
4 votes
Voir stackoverflow.com/questions/2651112/
1 votes
@PratikDeoghare Non, la question n'est pas de choisir un algorithme entièrement différent. Vous pouvez toujours convertir une fonction récursive en une méthode fonctionnant de manière identique et utilisant une boucle. Par exemple, cette réponse a le même algorithme en format récursif et en boucle . En général, vous placerez un tuple des arguments de la fonction récursive dans une pile, en poussant sur la pile pour appeler, en rejetant de la pile pour retourner de la fonction.