`scala.util.control.TailCalls.TailRec`和`scala.annotation.tailrec`有什么区别?

时间:2017-05-03 04:44:16

标签: scala recursion

scala标准库似乎提供了两种方法来确保递归函数不会导致堆栈溢出。

一个是@tailrec注释,它可能导致编译器以不同的方式执行某些操作,或者尝试额外努力尝试尾递归。

另一种方法是实际更改函数签名以返回TailRec[T],然后使用TailCalls.doneTailCalls.tailcall函数来包装返回值。

有什么区别?当编译器似乎能够为我做这件事时,有没有理由使用TailRec

1 个答案:

答案 0 :(得分:4)

@tailrec注释是尾递归保证。如果用@tailrec注释的函数实际上不是尾递归,则编译将失败。 (由于尾递归函数不会导致堆栈溢出,因此这种保证在生产代码中特别有用。)

scala.util.control.TailCalls是一种使用 trampolining 实现尾递归的机制 - 有关详细信息,请参阅this question