先上code
class Test { public static void main(String args[]) { int n = 45; long time1 = now(); System.out.print("fibonacci("+n+") = " + fibonacci(n) ); System.out.println(" cost: " + (now() - time1)); time1 = now(); System.out.print("fibonacci2("+n+") = "+ fibonacci2(n)); System.out.println(" cost: " + (now() - time1)); } public static long now(){ return System.currentTimeMillis(); } public static long fibonacci(int n){ if(n == 1) return 1; if(n == 2) return 1; return fibonacci(n-1) + fibonacci(n-2); } public static long fibonacci2(int n){ long num1 = 1; long num2 = 1; if(n == 1 || n == 2){ return 1; } long numn = 0; for(int i =3;i <= n ; i ++){ numn = num1 + num2; num1 = num2; num2 = numn; } return numn; } }
执行结果:
分析:
fibonacci的实现是基于递归的,会有很多重复的计算。每次计算都是一种崭新的计算,没有充分利用之前计算的结果,造成了严重的浪费。
fibonacci2的实现是基于动态规划的,自底向上,充分利用了上一次的计算结果。性能上相差很大。