我在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)
}
}
我很好奇编译器是否会优化掉递归调用。如果前导比较成功,则递归调用只能 。如果没有,有没有办法早期轰炸并仍然实现尾部递归优化?
答案 0 :(得分:3)
因此,正如@omnomnom所说,您可以通过向方法添加@tailrec
注释来检查是否正在对某些内容进行TCO编辑。如果编译器无法选择它,则会抛出错误。
我们可以通过一个简单的例子验证这一点:
@tailrec
def fact(n : Int) : Int = fact(n - 1) * 2
编译器弹出以下错误:
test.scala:6:错误:无法优化@tailrec带注释的方法事实:它包含一个不在尾部位置的递归调用
然而,尝试在你的程序中,答案是......是的!显然,编译器很乐意优化你的尾调用: - )