关于Fibonacci数的效率的考虑

很容易就可以得到递推公式的斐波那契数列的递归解法,但是又没有考虑过,递归虽然酷,但是效率呢?

	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));
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章