一个老生常谈的问题,斐波那契数组,
求第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.