Java 使用大整数时间复杂度的递归斐波那契

Java 使用大整数时间复杂度的递归斐波那契,java,recursion,time-complexity,big-o,fibonacci,Java,Recursion,Time Complexity,Big O,Fibonacci,你能解释一下以下算法的复杂性吗 public biginger fibBigInt(){ 返回fibBigInt( BigInteger.valueOf(n), 一,, BigInteger.valueOf(0)); } 私有biginger fibBigInt(biginger开始,biginger val,biginger先前){ if(start.compareTo(BigInteger.valueOf(0))==0){ 返回上一个; } 返回fibBigInt( 开始。减去(一), va

你能解释一下以下算法的复杂性吗

public biginger fibBigInt(){
返回fibBigInt(
BigInteger.valueOf(n),
一,,
BigInteger.valueOf(0));
}
私有biginger fibBigInt(biginger开始,biginger val,biginger先前){
if(start.compareTo(BigInteger.valueOf(0))==0){
返回上一个;
}
返回fibBigInt(
开始。减去(一),
val.add(先前),
val);
}

这个递归如何在O(n)时间内运行?我有点困惑。

斐波那契是不同复杂性类别的标准示例,因为根据定义,朴素的方法需要
O(2^n)
时间,而线性解只需要
O(n)
时间。这一个适用于线性模式

其思想是有一个起始值(
fib(0)
fib(1)
),并通过调用它一次,从
fib(n+1)
迭代计算
fib(n+2)
。诀窍是不仅要存储来自
fib(n+1)
的结果,还要存储来自
fib(n)
的结果。这是通过“旋转”每个递归步骤中的
fib(n+1)
fib(n)
的值来实现的

因此,最好用一个例子(
n
=5)来解释它是如何工作的。请注意,参数
m
是您想要的斐波那契数的输入值
m
的值在减小,值0表示递归的结束。您的代码被截断后与计数器
m
一起运行,并且没有属性
n

n
m
fib(n+1)
fib(n)
评论 0 5. 1. 0 代码的前6行 1. 4. 1+0 = 1 1. 迭代步骤,代码的最后4行。当前的
fib(n+1)
是上一行的
fib(n+1)
+
fib(n)
fib(n)
是上一行的
fib(n+1)
。 2. 3. 1+1 = 2 1. 见上文 3. 2. 2+1 = 3 2. 4. 1. 3+2 = 5 3. 5. 0 5+3 = 8 5. 现在术语
start.compareTo(biginger.valueOf(0))
变为0,因此
fib(n)
(5)的值将通过每次递归调用返回并“转发”回。
你认为它什么时候开?你有什么估计/推理吗?@dratenik IDK。我很难理解这个递归。我读到的是典型的O(2^n)时间。但这看起来像是尾部递归,所以我不小心猜到了O(n)的时间。请不要通过破坏你的帖子为其他人做更多的工作。通过在Stack Exchange网络上发布,您已授予Stack Exchange在下不可撤销的权利,以分发该内容(即,无论您未来的选择如何)。根据堆栈交换策略,帖子的非破坏版本是分发的版本。因此,任何故意破坏行为都将恢复原状。如果你想了解更多关于删除帖子的信息,请参阅:谢谢你的解释。我现在开始了解它是如何运行线性时间的。所以这个特定方法的递推关系是T(n-1)+O(1)?否,它是T(n)=T(n-1)+c,其中c是比较、添加、转发等恒定时间量的时间消耗。这等于T(n)=T(n-1)+c=n*c+递归结束的恒定时间;因此T(n)处于O(n)等待中,为什么T(n)=T(n-1)+c=n*c?^^T(0)=c';T(n)=T(n-1)+c=T(n-2)+c+c=T(n-2)+2c=T(n-3)+3c=…=T(1)+(n-1)*c=T(0)+n*c=c'+n*c