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

したがって、@ omnomnomが言うよう@tailrecに、メソッドにアノテーションを追加することで、何かがTCOされているかどうかを確認できます。コンパイラが最適化できない場合、コンパイラはエラーをスローします。

これは簡単な例で確認できます。

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

コンパイラは次のエラーで爆破します。

test.scala:6:エラー:@tailrec注釈付きメソッドを最適化できませんでした事実:テール位置にない再帰呼び出しが含まれています

あなたのプログラムでこれを試してみてください、しかし、答えは...はいです!したがって、コンパイラは末尾呼び出しを最適化して喜んでいるようです:-)

于 2013-03-19T15:25:16.357 に答える