【发布时间】:2021-05-17 00:26:42
【问题描述】:
我想找到斐波那契数列的第 100 个元素,我最初尝试使用 int 存储数字的值,但它溢出并切换到负值,就像 long 一样。
然后我遇到了 @987654324 @ 我确实使用简单的 for 循环和 array 来存储结果并访问以前的元素得到了解决方案。
现在我尝试使用 recursion 解决同样的问题要终止。我在这里错过了什么吗?还是不建议将 BigInteger 与递归一起使用?
这里是代码:
import java.math.BigInteger;
class Test {
public static void main(String[] args) {
BigInteger n = BigInteger.valueOf(100);
System.out.println(fib(n));
}
public static BigInteger fib(BigInteger n) {
if (n.compareTo(BigInteger.valueOf(1)) == 0 || n.compareTo(BigInteger.valueOf(1)) == -1)
return n;
return fib(n.subtract(BigInteger.valueOf(1))).add(fib(n.subtract(BigInteger.valueOf(2))));
}
}
【问题讨论】:
-
直到 100 非常长,而且您的方法性能不是最好的,因为您要多次计算大量值
-
您是如何确定程序没有终止的?你打电话给
fib354224848179261915075 次,显然这需要一段时间。 -
看看如何让它更快here。
-
@MrakVladar:好吧,如果我们假设
fib只需要一个时钟周期来执行(这是一个非常乐观的假设,因为在 Core i9 上,long的简单ADD已经占用了大约十几个时钟周期),我们进一步假设您有 4GHz CPU,那么fib(100)将需要大约 2800 年。 -
写
if (n.compareTo(BigInteger.valueOf(1)) <= 0)而不是if (n.compareTo(BigInteger.valueOf(1)) == 0 || n.compareTo(BigInteger.valueOf(1)) == -1)。compareTo对于“小于”结果不保证返回 -1,只有 一些 负数。