2

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

我很好奇编译器是否会优化递归调用。递归调用只有在前导比较成功时才会发生。如果没有,有没有办法早点轰炸,仍然实现尾递归优化?

4

1 回答 1

3

@tailrec因此,正如@omnomnom 所说,您可以通过将注释添加到方法来检查某些内容是否正在被 TCO 编辑。如果编译器无法优化它,它会抛出一个错误。

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

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

编译器出现以下错误:

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

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

于 2013-03-19T15:25:16.357 回答