次のコードを実行すると:
public static void main(String[] argsv) {
long whichFib = 45;
long st;
st = System.currentTimeMillis();
System.out.println(recursiveFib(whichFib));
System.out.println("Recursive version took " + (System.currentTimeMillis() - st) + " milliseconds.");
st = System.currentTimeMillis();
System.out.println(iterativeFib(whichFib));
System.out.println("Iterative version took " + (System.currentTimeMillis() - st) + " milliseconds.");
}
public static long recursiveFib(long n) {
if (n == 0)
return 0;
if (n == 1 || n == 2)
return 1;
return recFib(n - 1) + recFib(n - 2);
}
public static long iterativeFib(long n) {
if (n == 0)
return 0;
else if (n == 1 || n == 2)
return 1;
long sum = 1;
long p = 1;
long u = 1;
for (int i = 2; i < n; i++) {
sum = p + u;
p = u;
u = sum;
}
return sum;
}
次の出力が得られます。
1134903170 再帰バージョンは 5803 ミリ秒かかりました。1134903170 反復バージョンは 0 ミリ秒かかりました。
ここで何か間違ったことをしたような気がします。末尾呼び出し (再帰的なフィボナッチ法の最後の行) がコンパイラによって最適化され、反復バージョンに速度が近づくと考えました。なぜこれが非常に遅く実行されているのか、誰にも考えがありますか? それは単に不十分に書かれた機能ですか?
NB私はOracle JDK 1.7を使用しています