7

我想看看.tailIL 指令,但是我一直在编写的使用尾调用的简单递归函数显然已优化为循环。我实际上是在猜测这一点,因为我不完全确定 Reflector 中的循环是什么样的。不过,我绝对看不到任何.tail操作码。我在项目的属性中检查了“生成尾调用”。我还尝试了 Reflector 中的调试和发布版本。

我使用的代码来自Chris Smith 的 Programming F#,第 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

4

1 回答 1

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)

(刚刚没试过)。

编辑

也可以看看

我如何知道一个函数是否在 F# 中是尾递归的

于 2010-06-05T07:32:34.870 回答