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