我希望看到.tail IL指令,但是使用我一直在编写的使用尾部调用的简单递归函数显然已优化为循环。我实际上是在猜测,因为我不太确定Reflector中的循环是什么样子。我绝对看不到任何.tail操作码。我在项目的属性中选中了“Generate tail call”。我还尝试了在Reflector中调试和发布版本。

我使用的代码来自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

任何人都可以建议一些确实会生成.tail的简单F#代码吗?

最佳答案

相互递归函数应:

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#

关于.net - 生成.tail IL指令的一些简单F#代码是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2979472/

10-13 06:38