【问题标题】:Scala Tail Recursion Optimization on Short-Circuited Boolean Operations短路布尔运算的Scala尾递归优化
【发布时间】:2013-03-19 15:19:15
【问题描述】:

我在 Scala 中写了一个这样的函数:

def isSorted[T](list : List[T])(compare : (T, T) => Boolean) : Boolean = {
    list match {
        case Nil => true
        case x :: Nil => true
        case x :: rest => !compare(rest.head, x) && isSorted(rest)(compare)
    }
}

我很好奇编译器是否会优化递归调用。递归调用在前导比较成功的情况下发生。如果没有,有没有办法早点炸掉,还能实现尾递归优化?

【问题讨论】:

  • 这就是@annotation.tailrec 的用途
  • 酷。它似乎被优化了。谢谢!
  • 要明确一点,@tailrec 并没有神奇地使方法尾递归,它使它不是尾递归的错误。

标签: scala tail-recursion short-circuiting


【解决方案1】:

因此,正如@omnomnom 所说,您可以通过在方法中添加@tailrec 注释来检查某些东西是否正在被TCO-ed。如果无法优化,编译器会抛出错误。

我们可以通过一个简单的例子来验证这一点:

@tailrec
def fact(n : Int) : Int = fact(n - 1) * 2

编译器出现以下错误:

test.scala:6: 错误:无法优化@tailrec 注释方法事实:它包含一个不在尾部位置的递归调用

但是,在您的程序上尝试这个,答案是……是的!所以显然编译器很乐意优化你的尾部调用:-)

【讨论】:

  • fact 的有趣定义你有 :)
猜你喜欢
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 2010-11-29
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多