寻找递归函数的时空复杂性

时间:2018-02-13 08:55:29

标签: python algorithm recursion data-structures

我徘徊在缓解递归函数的时间和空间复杂性:

考虑:

def power(a, n):
    if n==0:
        return 1
    else:
        return a*power(a, n-1)

当发现时间复杂度时:我认为T(n) = c + T(n-1)其中c是乘法的常数成本。

这可能会导致:c * n成本,即线性成本O(n)。但递归通常是指数成本。

另外,请考虑以下功能:

def power(a,n):
    if n==0:
        return 1
    if n%2 ==0:
        return power(a*a, n//2)
    else:
        return a*power(a*a, n//2)

上述函数将持续到:T(n) = c + T(n/2)这意味着成本将是c * log(n)意味着log(n)的复杂性。

如果分析是正确的,那么递归看起来和迭代算法一样快,那么开销来自哪里,是否存在任何指数递归算法?

1 个答案:

答案 0 :(得分:2)

递归在复杂性方面是指数不正确的。事实上,有一个定理,每个递归算法都有一个迭代模拟,反之亦然(可能使用额外的内存)。有关如何执行此操作的说明,请参阅here。另请查看维基百科中比较recursion and iteration的部分。

当递归函数在其某些流中调用自身不止一次时,最终会出现指数复杂性,就像斐波那契数字的着名例子一样:

def fib(n):
   if n < 2:
       return 1
   return fib(n - 1) + fib(n - 2)

但这并不意味着没有更快的递归实现。例如,使用memoization,您可以将其降低到线性复杂度。

仍然递归实现确实有点慢,因为在执行递归调用时应该存储堆栈帧,并且在返回值时应该恢复它。