很容易就可以得到递推公式的斐波那契数列的递归解法,但是又没有考虑过,递归虽然酷,但是效率呢?
int RecursiveFib(int n){
if(n==0) return 0;
if(n==1) return 1;
return RecursiveFib(n-1)+RecursiveFib(n-2);
}
这样的函数会调用巨多次,你会发现算到100根本就算不动了!于是是不是应该记下之前算过的解呢,那么每个N对应的Fib数是一定的,我们可以采用键值对的方式储存,那么这样子,就不会干重复的事情了,这也相当于我们手算时的思路!
import java.util.HashMap;
public class EffectiveFibonnacci {
HashMap<Integer, Integer> map;
EffectiveFibonnacci(){
map = new HashMap<Integer,Integer>();
map.put(0, 0);
map.put(1, 1);
}
int RecursiveFib(int n){
if(n==0) return 0;
if(n==1) return 1;
return RecursiveFib(n-1)+RecursiveFib(n-2);
}
int EffectiveFib(int n){
for(int i = 2;i <= n; i++){
map.put(i, map.get(i-1)+map.get(i-2));
}
return map.get(n);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
EffectiveFibonnacci xx = new EffectiveFibonnacci();
// System.out.println(xx.RecursiveFib(100));
System.out.println(xx.EffectiveFib(40));
}
}