在Scala中需要@tailrec注释?

时间:2016-01-26 09:51:11

标签: scala

我理解递归函数的问题以及堆栈溢出问题的风险。

但是,如果函数能够针对尾递归进行优化,那么为什么不会自动应用此优化,即。为什么我需要标记可以使用@tailrec进行优化的函数?

1 个答案:

答案 0 :(得分:5)

  

如果函数能够针对尾递归进行优化,那么为什么不自动应用此优化

不幸的是,我没有从SLS中找到一个可以保证这一点的报价。

  

为什么我需要标记一个可以使用@tailrec进行优化的函数?

注意:Scala不保证函数的正确尾递归,仅适用于方法

您没有注释可以优化的方法。您注释必须进行优化的方法,以便在无法优化时,您将收到编译错误。

请参阅the documentation for scala.annotation.tailrec

  

一种方法注释,用于验证该方法是否将使用尾调用优化进行编译。

     

如果存在,如果无法将方法优化为循环,编译器将发出错误。

文档在 优化的内容(“尾部调用优化”,当真正的Scala只优化直接尾递归)时会产生误导,但它明确注释的目的。

这种注释的原因在于,有时人们对什么是直接尾递归的直觉可能是错误的。关于“为什么Scala不优化我的尾递归方法”这一形式,有很多问题,其答案是“因为它不是尾递归”。 (Here is an example of a method where the fact that it can't be optimized is non-obvious.)因此,通过注释方法,您向编译器和开发人员发出信号,表明此方法必须进行优化。