斐波那契數列算法
阿新 • • 發佈:2017-05-25
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; }
斐波那契數列算法