我理解递归函数的问题和堆栈溢出问题的风险.
但是,如果函数能够针对尾递归进行优化,那么为什么不会自动应用此优化,即.为什么我需要标记一个可以优化的功能@tailrec?
如果函数能够针对尾递归进行优化,那么为什么不自动应用此优化
这是.
不幸的是,我没有从SLS中找到一个可以保证这一点的报价.
为什么我需要标记一个可以优化的功能
@tailrec?
注意:Scala不保证函数的正确尾递归,仅适用于方法!
您没有注释可以优化的方法.您注释必须优化的方法,以便在无法优化时出现编译错误.
请参阅以下文档scala.annotation.tailrec:
一种方法注释,用于验证将使用尾调用优化来编译该方法.
如果存在,如果无法将方法优化为循环,编译器将发出错误.
该文件是在误导究竟什么是优化的("尾调用优化"的时候,确实只斯卡拉优化直接尾递归),但它是明确注释的目的.
这种注释的原因在于,有时人们对什么是直接尾递归的直觉可能是错误的.这里有很多关于"为什么Scala不优化我的尾递归方法"的形式的问题,其答案是"因为它不是尾递归的".(这是一个方法的示例,其中无法优化的事实是非显而易见的.)因此,通过注释方法,您向编译器和您的开发人员发信号通知必须优化此方法.