Le C# n'optimise pas la récursivité des appels de queue, car le F# est fait pour ça !
Pour plus de détails sur les conditions qui empêchent le compilateur C# d'effectuer des optimisations de type "tail-call", voir cet article : Conditions d'appel de queue JIT CLR .
Interopérabilité entre C# et F#
C# et F# interagissent très bien, et comme le Common Language Runtime (CLR) de .NET a été conçu dans l'optique de cette interopérabilité, chaque langage est conçu avec des optimisations spécifiques à son intention et à ses objectifs. Pour un exemple qui montre à quel point il est facile d'appeler du code F# à partir de code C#, voir Appeler du code F# à partir de code C# ; pour un exemple d'appel de fonctions C# à partir de code F#, voir Appeler des fonctions C# depuis F# .
Pour l'interopérabilité des délégués, voir cet article : Interopérabilité des délégués entre F#, C# et Visual Basic .
Différences théoriques et pratiques entre C# et F#
Voici un article qui couvre certaines des différences et explique les différences de conception de la récursion par appel de queue entre C# et F# : Génération d'Opcode Tail-Call en C# et F# .
Voici un article avec quelques exemples en C#, F# et C++. \CLI : Aventures dans la récursion de queue en C#, F# et C++ \CLI
La principale différence théorique est que C# est conçu avec des boucles alors que F# est conçu sur les principes du Lambda calculus. Pour un très bon livre sur les principes du Lambda calculus, voir ce livre gratuit : Structure et interprétation des programmes informatiques, par Abelson, Sussman et Sussman. .
Pour un très bon article d'introduction aux appels de queue en F#, voir cet article : Introduction détaillée aux appels de queue en F# . Enfin, voici un article qui traite de la différence entre la récursion sans appel de queue et la récursion avec appel de queue (en F#) : Récursion à queue ou récursion sans queue en fa dièse .
0 votes
Je lisais aujourd'hui un livre sur les structures de données qui divise la fonction récursive en deux, à savoir
preemptive
(par exemple, l'algorithme factoriel) etNon-preemptive
(par exemple, la fonction d'Ackermann). L'auteur a donné seulement deux exemples que j'ai mentionnés sans donner un raisonnement approprié derrière cette bifurcation. Cette bifurcation est-elle la même que pour les fonctions récursives à queue et sans queue ?7 votes
Conversation utile à ce sujet par Jon skeet et Scott Hanselman sur 2016 youtu.be/H2KkiRbDZyc?t=3302
0 votes
@RBT : Je pense que c'est différent. Il s'agit du nombre d'appels récursifs. Les appels de queue concernent les appels qui apparaissent en position de queue, c'est-à-dire la dernière chose qu'une fonction fait donc elle renvoie directement le résultat de l'appelé.
0 votes
Pour information, les versions 64 bits de .Net Framework 4.8 soutient le TCO . Cependant, cela semble avoir été abandonné dans Core.