【发布时间】:2020-10-25 16:55:50
【问题描述】:
我见过的大多数递归函数(例如 Fibonacci 或 Hanoi)都有 O(1) returns,但如果不是 O(1) 而是 O(n)?
例如,具有 O(n) 基本情况的递归斐波那契:
class fibonacci {
static int fib(int n) {
if (n <= 1)
for (int i=0;i<n;i++) {
// something
}
return n;
return fib(n-1) + fib(n-2);
}
public static void main (String args[])
{
int n = 9;
System.out.println(fib(n));
}
}
【问题讨论】:
-
您必须计算基本情况由
fib(n)触发的次数;将此计数乘以基本情况的复杂性;并将其添加到您的复杂性计算中。斐波那契的这段代码已经非常复杂了。添加n * (number of calls to fib(0) and fib(1))只会让情况变得更糟。 -
我从中截取这个的网站说斐波那契复杂度(没有 for 循环)是 O(2^n),这个复杂度是多少? O(2^n+n*2^n)?
-
是的。请注意,O(2^n) 是斐波那契简单实现的粗略上限。它实际上是 Θ(φ^n) ≈ Θ(1.618^n)。如果两个递归调用是对
fib(n-1),则为Θ(2^n),但其中一个是对fib(n-2),这使它稍微快一些。
标签: performance recursion time-complexity fibonacci