短路布尔运算的Scala尾递推优化

时间:2013-03-19 15:19:15

标签: scala tail-recursion short-circuiting

我在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)
    }
}

我很好奇编译器是否会优化掉递归调用。如果前导比较成功,则递归调用只能 。如果没有,有没有办法早期轰炸并仍然实现尾部递归优化?

1 个答案:

答案 0 :(得分:3)

因此,正如@omnomnom所说,您可以通过向方法添加@tailrec注释来检查是否正在对某些内容进行TCO编辑。如果编译器无法选择它,则会抛出错误。

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

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

编译器弹出以下错误:

  

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

然而,尝试在你的程序中,答案是......是的!显然,编译器很乐意优化你的尾调用: - )