1. 程式人生 > >斐波那契數列算法

斐波那契數列算法

string () lis temp -1 代碼 需要 cci key

今天研究了下Fibonacci算法,實現了遞歸和非遞歸兩種方式得到指定第n個的值。

代碼如下:

遞歸方式:
    public static int getFib(int a){
        if (a==1||a==2) {return 1;}
        return getFib(a-2)+getFib(a-1);
    }

非遞歸方式:
    public static int getFib2(int a){
        int x=1;
        int y=1;
        if(a==1||a==2){
            return 1;
        }
        
for (int i=3;i<=a;i++){ int temp=y; y=x+y; x=temp; } return y; }

打印出前n項,每行5個
public static void listFib(int a){
        StringBuilder sb = new StringBuilder();        
        for (int i=1;i<=a;i++){
            sb.append(getFib2(i)+" ");
            
if (i%5 == 0) sb.append("\n"); } System.out.println(sb); }
測試:
    public static void main(String[] args){
        listFib(40);
    }
測試結果:
1 1 2 3 5 
8 13 21 34 55 
89 144 233 377 610 
987 1597 2584 4181 6765 
10946 17711 28657 46368 75025 
121393 196418 317811 514229 832040 
1346269 2178309 3524578 5702887 9227465 
14930352 24157817 39088169 63245986 102334155 

比較遞歸和非遞歸兩種算法,發現遞歸算法效率較低,主要原因是遞歸會涉及到重復計算,可以通過緩存方式緩解,具體就是將計算的每項記錄到一個map裏,需要時直接get而不必重新計算,優化後代碼如下:

加入緩存優化後的遞歸算法:
    public static int getFib(int a){
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        if (a==1||a==2) {return 1;}
        if (map.containsKey(a)){
            return map.get(a);
        }
        Integer b = getFib(a-2)+getFib(a-1);
        map.put(a, b);
        return b;
    }

斐波那契數列算法