什么是生成.tail IL指令的简单F#代码?

时间:2010-06-05 06:54:56

标签: .net f# tail-recursion tail-call-optimization

我想看看.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吗?

1 个答案:

答案 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)

(刚才没试过)。

修改

另见

How do I know if a function is tail recursive in F#