4

在参与了这个惨败问题的辩论之后,我想向整个社区提出这个问题。

在什么场景下,尾调用优化将应用于基于 .Net 的代码?

请用可靠的、最新的来源或可重复的实验来支持你的答案。

4

1 回答 1

4

根据 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之前评估的,并且在调用之后不存在要执行的操作,因此可以丢弃当前堆栈帧。

于 2010-02-19T04:41:49.813 回答