在参与了这个惨败问题的辩论之后,我想向整个社区提出这个问题。
在什么场景下,尾调用优化将应用于基于 .Net 的代码?
请用可靠的、最新的来源或可重复的实验来支持你的答案。
根据 Don Syme 等人撰写的“Expert F#”,F# 会进行尾调用优化。我似乎记得在 Eric Lippert 的博客上读到 C# 编译器(任何版本)都没有。如果我错了,请纠正我,埃里克。在所有情况下,尾调用优化都可以在最后一条指令调用方法时进行。这通常是对方法本身的递归调用,但并非必须如此。可以进行优化,因为可以保证不再需要当前的堆栈帧。但是,如果之后必须执行一个简单的操作,则无法执行优化。
int Fib(int n)
{
if(n < 2)
return 1;
return Fib(n-1) + Fib(n-2);
}
这不能进行尾调用优化,因为在最后一次调用返回+
之前无法评估。Fib
(实际上我认为这也是 Expert F# 中使用的示例,但不确定。)
int Fib(int n, int a, int b)
{
if(n == 0)
return a+b;
return Fib(n-1,a+b,a);
}
这个版本可以进行尾调用优化,因为所有参数都是在最后一次调用 Fib之前评估的,并且在调用之后不存在要执行的操作,因此可以丢弃当前堆栈帧。