zoukankan      html  css  js  c++  java
  • FeiBoStr 斐波那契

    一个老生常谈的问题,斐波那契数组,

    求第N个, 这里注意,

    Integer 默认最大值 为 2147483647 即正数的21亿左右 ,对应斐波数的 Feib(46), eg:feib(46) = 1836311903
    所有如果让你求 第50个feibo 数,Integer 是无法满足的,

    同理,

    Long 默认最大值 为 9223372036854775807  ,对应斐波数的 Feib(92), eg:feib(92) = 7540113804746346429
    所有如果让你求 第100个feibo 数,Long是无法满足的,

    最常见的,斐波两种求法:

    递归

    F(n) = F(n-1)+F(n-2)

    //递归算法, 返回int,Oops,这个只能计算 46以内的。。
    private
    static int get(int num) { if (num <= 2) { return 1; } return get(num - 1) + get(num - 2); }

    非递归算法(推荐) :

    private static int getFibFori(int num) {
            if (num <= 2) {
                return 1;
            }
            int bef = 1;
            int aft = 1;
            int sum = 0;
            for (int i = 3; i <= num; i++) {
                sum = bef + aft;
                bef = aft;
                aft = sum;
            }
            return sum;
        }

    或者

     /**
         * 非递归模式;
         *
         * @param num num
         * @return int
         */
        private static int getFib(int num) {
            if (num <= 2) {
                return 1;
            }
            int sum = 0;
            Queue<Integer> queue = new LinkedList<>();
            queue.add(1);
            queue.add(1);
            while ((num = num - 1) >= 2) {
                int bef = queue.poll();
                int after = queue.poll();
                sum = bef + after;
                queue.offer(after);
                queue.offer(sum);
            }
            return sum;
        }

    *******************************************************

    重点,如果让你求 第100个斐波那契数,摆明了就是 Integer 和Long 不可用

    这里可以使用 BigInteher ,

    注意这里,.add(new BigInteher("XXX")) 表示加,

    /**
         * BigInteger 版本
         */
    
        private static BigInteger febBig(int num) {
            if (num <= 2) {
                return new BigInteger("1");
            }
            BigInteger bef = new BigInteger("1");
            BigInteger aft = new BigInteger("1");
            BigInteger sum = new BigInteger("0");
            while (num > 2) {
                sum = bef.add(aft);
                bef = aft;
                aft = sum;
                num--;
            }
            return sum;
        }

    这样可以将上面的 都改造为 BigInteger 版本

    PPS: 斐波那契是有通项公式的,但是既然考察,不可能让你背 斐波公式,

    Fn={[(1+√5)/2]^n-[(1-√5)/2]^n}/√5

    这里权做 记录就好了。

    over.

    多想,多试
  • 相关阅读:
    献给需要购买 阿里云产品的朋友
    当硬件没问题的时候,提升电脑运行速度
    IIS网页GZIP压缩
    前端优化-如何计算白屏和首屏时间
    Javascript 思维导图
    总结get和post区别---面试用
    点击切换样式、以及点击自身移除样式效果
    各行换色
    计算器
    无缝轮播图
  • 原文地址:https://www.cnblogs.com/junyi0120/p/10622344.html
Copyright © 2011-2022 走看看