• 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.

    多想,多试
  • 相关阅读:
    new Array()和 = [] 二种初始化数组的性能比较
    指定 Flash Player 在加载对象前是否应检查跨域策略文件是否存在
    FLEXRangeError: Error #2006: 提供的索引超出范围
    把RSS订阅到邮箱去
    使用特殊效果创建一个堆叠纸张对登录表单
    30个特别的涂鸦和壁画
    12个免费的从文本到语音转换 的在线服务和工具
    40个创意的IPhone壁纸大集合,做应用程序必备
    如何防止 yum 自动更新
    VirtualBox 与 宿主机剪贴板共享问题
  • 原文地址:https://www.cnblogs.com/junyi0120/p/10622344.html
Copyright © 2020-2023  润新知