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

标签 .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 ?

最佳答案

相互递归函数应该:

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/

相关文章:

f# - F#中的异步屏障

c++ - 递归函数是否有部分尾调用优化?

javascript - 如何将这个递归变成尾递归?

c# - 如何显示来自另一个线程的表单

c# - 无法加载文件或程序集 "Microsoft.VisualStudio.Services.Common, Version=12.0.21005.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

asp.net - 如何在asp.net中使用公共(public)变量?

f# - F# 中自定义运算符的优先级

.net - 如何将 PFX Task.Factory.StartNew 用于带有参数的 F# 函数?

C# 体系结构指南与 JavaEE

c++ - 为什么函数中的局部数组似乎可以防止 TCO?