我了解递归函数的问题以及堆栈溢出问题的风险。
但是,如果一个函数能够针对尾递归进行优化,那么为什么不自动应用此优化,即。为什么我需要标记一个可以优化的函数@tailrec
?
如果一个函数能够针对尾递归进行优化,那么为什么不自动应用此优化
It is.
不幸的是,我还没有找到 SLS 的报价来保证这一点。
为什么我需要标记一个可以优化的函数@tailrec
?
注意:Scala 不保证函数正确的尾递归,仅适用于methods!
你没有注释方法can进行优化。您注释的方法must进行优化,这样当它们时你会得到一个编译错误can't进行优化。
See 的文档scala.annotation.tailrec http://scala-lang.org/files/archive/nightly/2.12.x/api/2.12.x/#scala.annotation.tailrec:
方法注释,用于验证该方法将使用尾调用优化进行编译。
如果存在,并且该方法无法优化为循环,则编译器将发出错误。
该文档准确地具有误导性what被优化(“尾部调用优化”,实际上 Scala 只优化直接尾递归) 但它is明确注释的目的。
进行此注释的原因是,有时人们对于什么是直接尾递归、什么不是直接尾递归的直觉可能是错误的。这里有很多关于“为什么 Scala 不优化我的尾递归方法”的问题,其答案是“因为它isn't尾递归”。(这是一个方法的示例,其中无法优化的事实并不明显。 https://stackoverflow.com/q/4520781/2988)因此,通过注释一个方法,您可以向编译器和其他开发人员发出信号,表明该方法must进行优化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)