J'essaie de comprendre la récurrence de la queue chez Haskell. Je pense que je comprends ce que c'est et comment cela fonctionne mais je voudrais m'assurer que je ne fais pas de bêtises.Recursion de queue dans Haskell
Voici la définition factoriel "standard":
factorial 1 = 1
factorial k = k * factorial (k-1)
Lors de l'exécution, par exemple, factorial 3
, ma fonction sera lui-même appeler 3 fois (donner ou prendre). Cela pourrait poser un problème si je voulais calculer factorielle 99999999 car je pourrais avoir un débordement de pile. Après que j'arrive à factorial 1 = 1
je devrai "revenir" dans la pile et multiplier toutes les valeurs, donc j'ai 6 opérations (3 pour appeler la fonction elle-même et 3 pour multiplier les valeurs).
Maintenant, je vous présente une autre possible mise en œuvre factoriel:
factorial 1 c = c
factorial k c = factorial (k-1) (c*k)
Celui-ci est récursive aussi. Il s'appellera 3 fois. Mais il n'a pas alors le problème de devoir "revenir" pour calculer les multiplications de tous les résultats, car je passe déjà le résultat en argument de la fonction.
Ceci est, pour ce que j'ai compris, ce que Tail Recursion est à propos. Maintenant, il semble un peu mieux que le premier, mais vous pouvez toujours avoir des débordements de pile aussi facilement. J'ai entendu dire que le compilateur de Haskell va convertir les fonctions Tail-Recursive en boucles en arrière-plan. Je suppose que c'est la raison pour laquelle il est payant de faire des fonctions récursives de la queue?
Si c'est la raison alors il n'y a absolument aucun besoin d'essayer de rendre les fonctions récursives si le compilateur ne va pas faire ce tour intelligent - ai-je raison? Par exemple, bien qu'en théorie le compilateur C# puisse détecter et convertir les fonctions récursives de la queue en boucles, je sais (du moins c'est ce que j'ai entendu) qu'à l'heure actuelle il ne le fait pas. Il n'y a donc absolument aucun intérêt à rendre les fonctions récursives de nos jours. Est-ce que c'est ça?
Merci!
signale simplement que la définition factoriel "standard" est 'factoriel 0 = 1' – irrelephant
Oui, je thoug ht de cela mais factorielle 1 = 1 est plus efficace. –
Vous savez, sauvegarder une seule étape d'itération est probablement la dernière chose à prendre en compte lors du calcul des factoriels. En outre, si vous essayez de calculer 99999999! Je suis sûr que les dépassements de pile seront le moindre de vos problèmes. –