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.

多想,多试
原文地址:https://www.cnblogs.com/junyi0120/p/10622344.html