我想看看.tail
IL指令,但是我一直在编写的使用尾调用的简单递归函数显然优化为循环。我实际上正在猜测这个,因为我不完全确定Reflector中的循环是什么样的。我绝对没有看到任何.tail
操作码。我在项目的属性中检查了“生成尾调用”。我也在Reflector中尝试了Debug和Release版本。
我使用的代码来自Programming F# by Chris Smith,第190页:
let factorial x =
// Keep track of both x and an accumulator value (acc)
let rec tailRecursiveFactorial x acc =
if x <= 1 then
acc
else
tailRecursiveFactorial (x - 1) (acc * x)
tailRecursiveFactorial x 1
有人可以建议一些简单的F#代码,它们确实会生成.tail
吗?
答案 0 :(得分:6)
相互递归函数应该:
let rec even n =
if n = 0 then
true
else
odd (n-1)
and odd n =
if n = 1 then
true
else
even (n-1)
(刚才没试过)。
修改
另见