我了解递归函数的问题以及堆栈溢出问题的风险。
但是,如果一个函数能够针对尾递归进行优化,那么为什么不自动应用这种优化。为什么需要标记一个可以优化的功能@tailrec
?
如果一个函数能够针对尾递归进行优化,那为什么不自动应用这种优化
这是。
不幸的是,我没有找到SLS的报价来保证这一点。
为什么需要标记一个可以优化的功能
@tailrec
?
注:Scala并不能保证适当的尾递归函数,只对方法!
您无需注释可以优化的方法。您注释必须优化的方法,以便在无法优化时会出现编译错误。
请参阅有关文档scala.annotation.tailrec
:
方法注解,用于验证将通过尾部调用优化来编译该方法。
如果存在,如果无法将方法优化为循环,则编译器将发出错误。
该文件是在误导究竟什么是优化的(“尾调用优化”的时候,确实只斯卡拉优化直接尾递归),但它是明确注释的目的。
使用此注释的原因是,有时人们对什么是直接尾递归以及什么不是直接直觉都可能是错误的。在SO上有很多问题,形式为“为什么Scala无法优化我的尾递归方法”,其答案是“因为它不是尾递归”。(这是一个方法的示例,其中无法优化它的事实是不明显的。)因此,通过对方法进行注释,可以向编译器和其他开发人员发出信号,说明必须对该方法进行优化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句