在Scala中需要@tailrec注释?

XOX*_*OXO 4 scala

我理解递归函数的问题和堆栈溢出问题的风险.

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

Jör*_*tag 5

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

.

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

为什么我需要标记一个可以优化的功能@tailrec

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

您没有注释可以优化的方法.您注释必须优化的方法,以便在无法优化时出现编译错误.

请参阅以下文档scala.annotation.tailrec:

一种方法注释,用于验证将使用尾调用优化来编译该方法.

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

该文件是在误导究竟什么是优化的("尾调用优化"的时候,确实只斯卡拉优化直接尾递归),但它明确注释的目的.

这种注释的原因在于,有时人们对什么是直接尾递归的直觉可能是错误的.这里有很多关于"为什么Scala不优化我的尾递归方法"的形式的问题,其答案是"因为它不是尾递归的".(这是一个方法的示例,其中无法优化的事实是非显而易见的.)因此,通过注释方法,您向编译器和您的开发人员发信号通知必须优化此方法.