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;
        }
  • 相关阅读:
    GitHub教程学习笔记1本地Git管理
    GitHub教程学习笔记2远程仓库和本地仓库
    图像分割方法综述
    println输出乱码
    ngshow,ngif区别
    isFile() exists() isDirectory()的区别
    File类中的list和listFiles方法
    mkdir与mkdirs的区别
    新建play项目eclipsify后导入eclipse后无法debug调试
    大龄屌丝自学笔记Java零基础到菜鸟021
  • 原文地址:https://www.cnblogs.com/clarke157/p/6901645.html
Copyright © 2011-2022 走看看