public class TestFib {
public static void main(String[] args) {
long n = 100l;
long t1 = System.currentTimeMillis();
long r1 = fib(n);
long t2 = System.currentTimeMillis();
//n到达一定大小之后,等待时间漫长到无法忍受,可能万物终点?
System.out.println("结果是: " + r1 + ", 耗时: " + (t2 - t1) + "MS");
//无论n多大,几乎都是0MS
long t3 = System.currentTimeMillis();
long r2 = fib2(n);
long t4 = System.currentTimeMillis();
System.out.println("结果是: " + r2 + ", 耗时: " + (t4 - t3) + "MS");
}
/**
* 普通方法:冗余计算次数过多,使其运算效率极低
* @param n
* @return
*/
public static long fib(long n) {
if(n==0l) {
return 0l;
} else if(n==1l) {
return 1l;
} else {
return fib(n-1) + fib(n-2);
}
}
/**
* 优化后的方法:基本无冗余计算,速度极快
* copy from Elminster in the forum of Java in Javaeye
* @param n
* @return
*/
public static long fib2(long n) {
long[] results = new long[(int)(n+1)];
for (long i = 0; i < results.length; i++) {
if(i==0l) {
results[(int)i] = 0l;
} else if(i==1l) {
results[(int)i] = 1l;
} else {
results[(int)i] = results[(int)(i-1l)] + results[(int)(i-2l)];
}
}
return results[(int)n];
}
}