我知道 Scala 对尾递归函数进行了优化(即递归调用是函数执行的最后一件事的那些函数)。我在这里要问的是是否有办法优化对不同函数的尾调用。考虑以下Scala
代码:
def doA(): Unit = {
doB()
}
def doB(): Unit = {
doA()
}
如果我们让它执行足够长的时间,它会产生一个堆栈溢出错误,可以通过分配更多的堆栈空间来缓解这个错误。尽管如此,它最终会超出分配的空间,并再次导致堆栈溢出错误。减轻这种情况的一种方法可能是:
case class C(f: () => C)
def run(): Unit = {
var c: C = C(() => doA())
while(true){
c = c.f.apply()
}
}
def doA(): C = {
C(() => doB())
}
def doB(): C = {
C(() => doA())
}
然而,这被证明是相当缓慢的。有没有更好的方法来优化这个?