• 斐波那契数列算法


    今天研究了下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;
        }
  • 相关阅读:
    P1092 虫食算
    P1040 加分二叉树
    cfER76 abcd
    cf599 div2 a/b1/b2/c
    AtCoder Contest 144 DE
    Round G 2019
    luogu3084 Photo 单调队列优化DP
    luogu4234 最小差值生成树
    luogu1373 小a和uim之大逃离
    luogu1070 道路游戏 单调队列
  • 原文地址:https://www.cnblogs.com/clarke157/p/6901645.html
Copyright © 2020-2023  润新知