由于 .net 有TailCall操作码,如果 F# 函数是真正的尾递归,这可以用来确定吗?
如果是真的,有没有人制作了一个识别尾函数和非尾函数的 VS 插件?
由于 .net 有TailCall操作码,如果 F# 函数是真正的尾递归,这可以用来确定吗?
如果是真的,有没有人制作了一个识别尾函数和非尾函数的 VS 插件?
有关 F# 如何编译尾调用的摘要,请参阅F# 团队博客上的这篇博文。
简而言之,
但请参阅完整帖子了解所有血腥细节。
是的,如果编译器发出tail
call 指令,那么该调用将是尾递归的(从 CLR 4 开始,但仍有一些例外,它实际上不会是尾递归的)。但这并不一定意味着整个函数都是尾递归的。例如,我可以想象 QuickSort 函数编译后,第一个递归调用不是尾递归,而第二个是尾递归。
另外,仅仅因为某些函数不包含tail
指令,并不一定意味着它不是尾递归的。tail
即使没有指令,JIT 编译器也可以识别尾调用并对其进行优化。
此外,F# 编译器有时会以非递归方式编译递归函数。tail
这与普通的尾调用优化和不使用指令有些不同,但总体效果相似。