如果我理解正确, scala.util.control.TailCalls 可用于通过使用蹦床来避免非尾递归函数的堆栈溢出。API 中给出的示例很简单:
import scala.util.control.TailCalls._
def isEven(xs: List[Int]): TailRec[Boolean] =
if (xs.isEmpty) done(true) else tailcall(isOdd(xs.tail))
def isOdd(xs: List[Int]): TailRec[Boolean] =
if (xs.isEmpty) done(false) else tailcall(isEven(xs.tail))
isEven((1 to 100000).toList).result
但是,更有趣的情况是,如果您想在 recurve 调用之后进行一些操作。我得到了一个“天真的”阶乘实现以某种方式运行
def fac(n:Long): TailRec[Long] =
if (n == 0) done(1) else done(n * tailcall(fac(n - 1)).result)
但这看起来很可怕,我怀疑这是预期用途。所以我的问题是如何使用 TailCalls 正确编写阶乘或斐波那契函数(是的,我知道如何使用累加器使它们尾递归)?还是 TailCalls 不适合这种问题?