web-dev-qa-db-fra.com

Puis-je utiliser des paramètres supplémentaires dans des problèmes de récursivité?

D'accord, j'étais interviewé lors d'une entreprise et l'intervieweur m'a demandé un problème de récursivité. C'était une interview en ligne, il avait donc mis en place la déclaration de problème et une signature de fonction sur CoDesandbox (un éditeur de code en ligne/outil de collaboration). J'étais censé remplir le corps de la fonction. Il n'avait qu'un seul paramètre dans la signature de fonction. J'ai ajouté un autre paramètre juste pour suivre le résultat. Il a dit que je ne devrais pas ajouter un autre paramètre (je fournis une valeur par défaut au paramètre supplémentaire), car elle modifie la signature de fonction.

Maintenant, à mon avis, si vous ajoutez un paramètre facultatif à la signature, cela ne ferait aucune différence. Laissez-moi prendre un exemple simple pour vous rendre plus clair pour vous:

Problème: Vérifiez si l'entrée est un palindrome.

Solution 1:

function isPalindrome(input, index = 0){
    const isAMatch = input[index] === input[input.length - 1 - index]

    if (index === Math.floor((input.length - 1) / 2)) {
        return isAMatch
    }

    if (isAMatch) {
        return isPalindrome(input, ++index)
    }

    return isAMatch
}

Dans la solution ci-dessus, j'ai ajouté un paramètre facultatif: index pour garder une trace de l'index à correspondre. La question ici est que s'il est raisonnable d'ajouter ce paramètre facultatif?

Solution 2:

function isPalindrome(str){
    if(str.length === 1) return true;
    if(str.length === 2) return str[0] === str[1];
    if(str[0] === str.slice(-1)) return isPalindrome(str.slice(1,-1))
    return false;
}

Dans cette solution, nous n'utilisons aucun paramètre supplémentaire.

Maintenant, je répète la question à nouveau, la solution 1 serait-elle considérée comme une solution non valide?

23
Bharat Soni

Je suppose que la question a été invitée à voir si vous pouvez appliquer un raisonnement fonctionnel. Techniquement, les deux solutions sont récursives.

La solution 1 ressemble beaucoup à une solution itérative. La prochaine "itération" est faite en appelant la fonction (récursivement) avec un index incrémenté.

La solution 2 montre le raisonnement fonctionnel. C'est la voie couramment acceptée de faire de la récursivité. Habituellement, une récursion appropriée peut avoir des paramètres supplémentaires qui portent des états intermédiaires. Cependant, il est très rare d'ajouter un compteur en tant que paramètre.

Pour l'intervieweur, vous insistez sur cette solution 1 une solution élégante pourrait montrer (vrai ou non) que vous avez un ensemble étroit d'outils pour la résolution de problèmes. Demander la récursivité vous donne la possibilité de montrer que vous connaissez un moyen fonctionnel de résoudre des problèmes. Vous montrant une solution itérative pourrait être ignorante sur les fonctions de puissance et d'élégance récursif pourraient contraster aux boucles.

Il y a un dicton de discussion dans la programmation: "Si le seul outil que vous avez est un marteau, tout ressemble à un clou." Vous auriez pu montrer que vous avez également un tournevis ;-)

0
Simon

Il existe de nombreuses situations dans lesquelles il existe une fonction qui nécessite une mise en œuvre, et une implémentation simple utilise une fonction récursive avec un paramètre supplémentaire. Par exemple, Quicksort, où la fonction d'origine a un argument (une matrice, en supposant qu'il soit possible de déterminer le nombre d'éléments de tableau), puis vous appelez une fonction récursive avec l'index du premier et du dernier élément d'un sous-réseau sous forme d'arguments. . Cette fonction récursive est probablement invisible à l'appelant d'origine.

0
gnasher729