有没有办法在 Scala 中优化尾调用?

问题描述

我知道 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())
}

然而,事实证明这很慢。有没有更好的方法来优化这个?

解决方法

这里有一种方法可以实现方法调用的无限进程,而无需消耗堆栈,每个方法决定接下来使用哪个方法。

def doA(): () => Any = {
  doB _
}
def doB(): () => Any = {
  doC _
}
def doC(): () => Any = {
  if (util.Random.nextBoolean()) doA _
  else                           doB _
}

Iterator.iterate(doA())(_.asInstanceOf[() => () => Any]())
        .foreach(identity)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...