【问题标题】:The need for the @tailrec annotation in Scala? [duplicate]Scala 中需要 @tailrec 注释吗? [复制]
【发布时间】:2016-01-26 09:51:10
【问题描述】:

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

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

【问题讨论】:

  • 我认为这个想法是,如果它无法进行尾部优化,你会得到一个错误,这与你的期望相反
  • scala编译器会自动优化尾递归方法,我认为tailrec注解只对调试有用,如果不能优化会报错。
  • 所以这就像一个编译时检查,看看你的函数是否被编写为利用尾递归?
  • @Ende - 感谢推荐 之前没有找到那个。

标签: scala


【解决方案1】:

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

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

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

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

您不注释可以优化的方法。您注释了必须优化的方法,这样当它们无法被优化时,你会得到一个编译错误。

the documentation for scala.annotation.tailrec:

一个方法注解,用于验证该方法将使用尾调用优化进行编译。

如果存在,如果方法不能优化成循环,编译器会报错。

文档在 什么 被优化(“尾调用优化”,实际上 Scala 只优化 直接尾递归)方面存在误导,但它 em> 清楚注释的目的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 2014-07-30
    相关资源
    最近更新 更多