Java Fibonacci算法的时间复杂度

Java Fibonacci算法的时间复杂度,java,recursion,methods,time-complexity,fibonacci,Java,Recursion,Methods,Time Complexity,Fibonacci,所以,我有一个Java中的递归方法来获得第n个斐波那契数——我唯一的问题是:时间复杂度是多少?我想是O2^n,但我可能弄错了?我知道迭代法更好,但这是一种练习 public int fibonacciRecursive(int n) { if(n == 1 || n == 2) return 1; else return fibonacciRecursive(n-2) + fibonacciRecursive(n-1); } 递归代码具有指数运行时。但我不认为基数是2,但黄金比

所以,我有一个Java中的递归方法来获得第n个斐波那契数——我唯一的问题是:时间复杂度是多少?我想是O2^n,但我可能弄错了?我知道迭代法更好,但这是一种练习

public int fibonacciRecursive(int n)
{
    if(n == 1 || n == 2) return 1;
    else return fibonacciRecursive(n-2) + fibonacciRecursive(n-1);
}

递归代码具有指数运行时。但我不认为基数是2,但黄金比率大概是1.62。当然,O1.62^n也会自动变成O2^n

运行时可以递归计算:

t(1)=1
t(2)=1
t(n)=t(n-1)+t(n-2)+1
这与斐波那契数本身的递归定义非常相似。递归方程中的+1可能与大n无关。我相信它的增长速度大约和fibo数一样快,并且以黄金分割率为基数呈指数增长


您可以使用memonization(即缓存已计算的结果)来加快速度。然后它在运行时就像迭代版本一样


迭代代码的运行时为On


您有一个简单的循环,每个迭代的步骤和时间都是恒定的。

您的递归代码具有指数运行时间。但我不认为基数是2,但黄金比率大概是1.62。当然,O1.62^n也会自动变成O2^n

运行时可以递归计算:

t(1)=1
t(2)=1
t(n)=t(n-1)+t(n-2)+1
这与斐波那契数本身的递归定义非常相似。递归方程中的+1可能与大n无关。我相信它的增长速度大约和fibo数一样快,并且以黄金分割率为基数呈指数增长


您可以使用memonization(即缓存已计算的结果)来加快速度。然后它在运行时就像迭代版本一样


迭代代码的运行时为On


你有一个简单的循环,每一次迭代都有一个固定的步骤和时间。

O2^n?我只看到这里

我想知道你为什么要继续计算这些?只要内存需求没有变得太令人讨厌,缓存您拥有的内存不是一个好主意吗


因为它们没有改变,如果速度对我来说很重要,我会生成一个表并进行查找。

O2^n?我只看到这里

我想知道你为什么要继续计算这些?只要内存需求没有变得太令人讨厌,缓存您拥有的内存不是一个好主意吗


由于它们没有改变,如果速度对我来说很重要,我会生成一个表并进行查找。

很容易看到并通过归纳证明对fibonacciRecursive的调用总数完全等于返回的最终值。这在输入数上确实是指数级的。

很容易看出并通过归纳证明,对fibonacciRecursive的调用总数完全等于返回的最终值。这确实是输入数的指数。

每个函数调用只执行一次加法,或返回1。基本情况仅返回值1,因此加法的总数为fibn-1。因此,函数调用的总数为2*fibn-1,因此时间复杂度为Θfibn=Θphi^N,以O2^N为界。

每个函数调用只执行一次加法,或返回1。基本情况仅返回值1,因此加法的总数为fibn-1。因此,函数调用的总数为2*fibn-1,因此时间复杂度为Θfibn=Θphi^N,以O2^N为界。

您可以使用此


要计算Olog n中的Fn,可以使用


要计算Olog n中的Fn

Ahhh,对不起,我发布了错误的代码。我需要一个递归的!我的坏消息,将在一秒钟内编辑。@lars这就是我为什么要写的原因,当然O1.62也会自动修改。但知道一个比2^n更接近的上界仍然很有趣。O@lars对不起,这是个打字错误。我想写O1.62^n是自动的O2^n,但是忘了^nahh,对不起,我发错代码了。我需要一个递归的!我的坏消息,将在一秒钟内编辑。@lars这就是我为什么要写的原因,当然O1.62也会自动修改。但知道一个比2^n更接近的上界仍然很有趣。O@lars对不起,这是个打字错误。我想写O1.62^n自动是O2^n,但忘记了^nNo,它稍微高一点。例如,Fib2有3个调用,但返回2个。但是对于大n来说,差异并不重要。不,它稍微高一点。例如,Fib2有3个调用,但返回2个。但对于大n来说,差异并不重要。“迭代更好”通常是错误的。它确实胜过了你天真的递归实现,但是该实现可以被改进到与使用动态编程的迭代实现基本一致。“迭代是更好的”通常是错误的。确实,它击败了您天真的递归实现,但是该实现可以被改进为与使用动态编程的迭代实现基本一致。