【发布时间】:2015-04-30 23:02:06
【问题描述】:
单个递归函数可以应用尾递归优化,以防止堆栈溢出,但是相互递归函数呢?
这个answer 展示了如何在 F# 中定义相互递归的函数:
let rec F() =
G()
and G() =
F()
是否以这种方式定义,以便生成的本机机器代码或字节码最终仅包含一个函数,并且对 F 和 G 都应用了尾递归优化?这会防止堆栈溢出吗?
对于相互递归的函数,尾调用算法如何工作?
另一方面,Haskell 不需要这样的语法。是因为 Haskell 的懒惰评估吗?或者正如@augustss 所建议的那样,Haskell 编译器是否也在做与上述相同的事情?
【问题讨论】:
-
语法对生成什么代码没有影响,除非编译器非常幼稚。
-
F# 在某些情况下确实优化了相互递归函数
标签: haskell f# functional-programming ml mutual-recursion