这个递归函数的时间复杂度

时间:2016-03-01 17:43:41

标签: c algorithm time-complexity

我试图找到这个块的时间复杂度,是O(n!)还是O(2 ^ n),怎么样?

void fun(int n)
{
    int i;
    count++;
    if(n>0)
    {
        for(i=1;i<n;i++)
        fun(n-i);
    }
}

我尝试了n的diff值和count给出的值acc。到2^n ??

感谢

1 个答案:

答案 0 :(得分:0)

每次调用T(n),都会调用T(n-1), T(n-2), ..., T(1)

这为我们提供了复杂功能:

T(1) = 1
T(n) = T(n-1) + T(n-2) + .... + T(1)

如果我们对任何T(k) <= c*2^k和某些常数k < n使用归纳和假设c(并且在正确检查T(1) = 1 <= 2^1之后,我们会得到:

T(n) = T(n-1) + ... + T(1) + 1 = 
     = c*2^(n-1) + c*2^(n-2) + ... + c*2^1 + 2^0  <= 
    <= c*(2^n - 1) <= c*2^n

最后一个等式来自几何系列的总和。

因此,我们可以得出结论T(n)位于Theta(2^n)