今天研究了下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(" "); } 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; }