La récursivité n'est pas intrinsèquement meilleure ou pire que les boucles - chacune présente des avantages et des inconvénients, et ceux-ci dépendent même du langage de programmation (et de la mise en œuvre).
Techniquement, les boucles itératives conviennent mieux aux systèmes informatiques classiques au niveau matériel: au niveau code machine, une boucle est simplement un test et un saut conditionnel, alors que la récursivité (implémentée naïvement) implique de pousser un cadre de pile, de sauter, de revenir en arrière et de revenir en arrière. de la pile. OTOH, de nombreux cas de récursion (en particulier ceux qui sont trivialement équivalents à des boucles itératives) peuvent être écrits de manière à éviter la pile push / pop; cela est possible lorsque l'appel de fonction récursif est la dernière chose qui se passe dans le corps de la fonction avant de renvoyer, et qu'il est communément appelé optimisation d'appel final (ou optimisation de récursivité finale ). Une fonction récursive correctement optimisée pour les appels en sortie est généralement équivalente à une boucle itérative au niveau du code machine.
Une autre considération est que les boucles itératives nécessitent des mises à jour d'état destructives, ce qui les rend incompatibles avec la sémantique du langage pur (sans effets secondaires). C'est la raison pour laquelle les langages purs tels que Haskell n'ont pas du tout de construction de boucle et que de nombreux autres langages de programmation fonctionnels en manquent complètement ou les évitent autant que possible.
La raison pour laquelle ces questions apparaissent si souvent dans les entretiens, c’est parce que, pour y répondre, vous devez comprendre de nombreux concepts de programmation essentiels - variables, appels de fonction, étendue et bien sûr boucles et récursions -, et vous avez apporter la flexibilité mentale à la table qui vous permet d'aborder un problème sous deux angles radicalement différents et de passer d'une manifestation à l'autre du même concept.
L'expérience et la recherche suggèrent qu'il existe une ligne de démarcation entre les personnes qui ont la capacité de comprendre les variables, les pointeurs et la récursion, et celles qui ne le sont pas. Presque tout le reste de la programmation, y compris les frameworks, les API, les langages de programmation et leurs cas extrêmes, peut être acquis par l'étude et l'expérience, mais si vous êtes incapable de développer une intuition pour ces trois concepts de base, vous ne pouvez pas être programmeur. Traduire une simple boucle itérative en une version récursive est le moyen le plus rapide de filtrer les non-programmeurs - même un programmeur plutôt inexpérimenté peut le faire en 15 minutes, et c'est un problème très agnostique pour le une langue de leur choix au lieu de trébucher sur des idiosyncracies.
Si vous rencontrez une question comme celle-ci lors d'une interview, c'est bon signe: cela signifie que l'employeur éventuel recherche des personnes capables de programmer, et non des personnes ayant mémorisé le manuel d'un outil de programmation.