我想看看.tail
IL 指令,但我一直在编写的使用尾部调用的简单递归函数显然已优化为循环。我实际上是在猜测这一点,因为我不完全确定反射器中的循环是什么样的。我绝对没有看到任何.tail
不过操作码。我在项目的属性中检查了“生成尾部调用”。我还尝试了 Reflector 中的调试和发布版本。
我使用的代码来自Chris Smith 的 F# 编程 https://rads.stackoverflow.com/amzn/click/com/0596153643,第 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)
(刚才还没试过)。
EDIT
See also
F# 中如何知道函数是否尾递归 https://stackoverflow.com/questions/806712/how-do-i-know-if-a-function-is-tail-recursive-in-f
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)