zoukankan      html  css  js  c++  java
  • 斐波那契数列算法

    今天研究了下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;
        }
  • 相关阅读:
    绝对定位和浮动的区别和运用
    xhtml css 漏 整理
    网站自适应设备屏幕
    CSS 媒体查询 响应式
    js/jquery判断浏览器 & 停止加载
    回调函数之同步调用、回调、异步调用
    Flash生成HTML5动画方法
    在html页面中使用js变量
    BZOJ 4417 Luogu P3990 [SHOI2013]超级跳马 (DP、矩阵乘法)
    NOI2019游记
  • 原文地址:https://www.cnblogs.com/clarke157/p/6901645.html
Copyright © 2011-2022 走看看