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


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