如果我运行以下代码:
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 毫秒。
我觉得我在这里做错了什么。我认为尾调用(递归斐波那契方法中的最后一行)将由编译器优化,使其在速度上更接近迭代版本。有谁知道为什么运行如此缓慢?它只是一个写得不好的函数吗?
注意我使用的是 Oracle JDK 1.7