单个递归函数可以对其应用尾递归优化,以防止堆栈溢出,但是相互递归函数呢?
这个答案显示了如何在 F# 中定义相互递归函数:
let rec F() =
G()
and G() =
F()
是否以这种方式定义,以便生成的本机机器代码或字节码最终仅包含一个函数,并且对 F 和 G 都应用了尾递归优化?这会防止堆栈溢出吗?
对于相互递归函数,尾调用算法如何工作?
另一方面,Haskell 不需要这样的语法。是因为 Haskell 的懒惰评估吗?或者正如@augustss 所建议的那样,Haskell 编译器是否也在做与上述相同的事情?