我徘徊在缓解递归函数的时间和空间复杂性:
考虑:
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)的复杂性。
如果分析是正确的,那么递归看起来和迭代算法一样快,那么开销来自哪里,是否存在任何指数递归算法?
答案 0 :(得分:2)
递归在复杂性方面是指数不正确的。事实上,有一个定理,每个递归算法都有一个迭代模拟,反之亦然(可能使用额外的内存)。有关如何执行此操作的说明,请参阅here。另请查看维基百科中比较recursion and iteration的部分。
当递归函数在其某些流中调用自身不止一次时,最终会出现指数复杂性,就像斐波那契数字的着名例子一样:
def fib(n):
if n < 2:
return 1
return fib(n - 1) + fib(n - 2)
但这并不意味着没有更快的递归实现。例如,使用memoization,您可以将其降低到线性复杂度。
仍然递归实现确实有点慢,因为在执行递归调用时应该存储堆栈帧,并且在返回值时应该恢复它。