假设我们有一个需要 n 步的方法,但在最坏的情况下它会线性调用自身 n 次。在这种情况下,大 O 会是 n*n 吗?那么递归调用通常是 n^2 类似于两个 for 循环吗?
现在让我们采用二进制递归算法,例如二进制斐波那契。该算法的 1 次调用需要 n 步,但假设它最多可以重复 n 次。该算法的运行时间会是 2^n 吗?
设f()
是一个调用自身 n 次的函数。考虑代表函数的 C 代码f()
。
int f(int n)
{
int i;
if(n==0)
{
printf("\n Recursion Stopped");
}
else
{
for(i=0;i<=n;i++)
{
printf("\n Hello");
}
f(n-1);
}
}
对于n = 5
,消息Hello
将被打印15
多次。对于n = 10
,消息Hello
将被打印55
多次。
一般来说,该消息将被打印n*(n+1)/2
多次。
因此函数f()的复杂度为O(n 2 )。记住f()
是一个函数,它具有复杂性n
并且f()
被递归地称为n
时间。如果内部循环包含诸如加法、减法等恒定时间表达式,则此类函数的复杂度等于以下循环顺序。
for(i=0;i<=n;i++)
{
for(j=i;j<=n;j++)
{
/* Some constant time operation */
}
}
对于 a Binary Recursion
,时间复杂度为O(2 n )。
二进制递归函数调用自身两次。
以下函数g()
是二进制递归的示例,(即 a Fibonacci binary recursion
)
int g(int n)
{
int i;
if(n==0)
{
printf("\n Recursion Stopped");
}
else
{
printf("\n Hello");
g(n-1);
g(n-2);
}
}
递推关系为g(n) = g(n-1)+g(n-2)
,对于n>1
。
求解我们得到O(2 n )的上限。该函数g()
也是Θ(φ n ),其中φ
是golden ratio
和φ = ((1+ √5)/2)