Fibonacci算法的时间复杂度

时间:2011-01-22 15:45:35

标签: java recursion methods time-complexity fibonacci

所以,我在Java中有一个递归方法来获得'第n个斐波纳契数 - 我唯一的问题是:时间复杂度是多少?我认为这是O(2 ^ n),但我可能会弄错? (我知道迭代更好,但这是一个练习)

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

5 个答案:

答案 0 :(得分:5)

您可以使用此

alt text

以O(log n)计算Fn

答案 1 :(得分:4)

您的递归代码具有指数运行时。但我不认为基数是2,但可能是黄金比例(约1.62)。但当然O(1.62 ^ n)也自动为O(2 ^ n)。

可以递归计算运行时:

t(1)=1
t(2)=1
t(n)=t(n-1)+t(n-2)+1

这与斐波那契数字本身的递归定义非常相似。递归方程中的+1可能与大n无关。我认为它的增长速度大约与纤维数一样快,并且随着黄金比例的增加呈指数增长。

您可以使用记忆加快速度,即缓存已计算的结果。然后它就像迭代版本一样具有O(n)运行时。


您的迭代代码的运行时间为O(n)

你有一个简单的循环,每次迭代都有O(n)步和恒定时间。

答案 2 :(得分:3)

每个函数调用只进行一次加法,或返回1.基本情况只返回值1,因此加法的总数为fib(n)-1。因此,函数调用的总数是2 * fib(n)-1,因此时间复杂度是Θ(fib(N))=Θ(phi ^ N),其以O(2 ^ N)为界。

答案 3 :(得分:0)

O(2 ^ N)?我在这里只看到O(n)。

我想知道为什么你会继续计算并重新计算这些?只要记忆要求不会变得太可恶,不会缓存那些你是个好主意的人吗?

由于它们没有改变,我会生成一个表并在速度很重要的情况下进行查找。

答案 4 :(得分:0)

很容易看到(并通过归纳证明)对fibonacciRecursive的调用总数与返回的最终值完全相同。这确实是输入数字的指数。