【发布时间】:2018-07-23 14:07:57
【问题描述】:
我在分析递归函数的时间和空间复杂性时磕磕绊绊:
考虑:
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) 复杂度。
如果分析正确,那么递归看起来和迭代算法一样快,那么开销从何而来,是否有任何指数递归算法?
【问题讨论】:
-
您可以将函数的顺序与它在实践中的运行速度(在小型数据集上)分开 - 一个简单的幂函数,迭代完成,比递归函数的开销要小得多,你在哪里设置每次通过一个新的堆栈框架和分支。正如您的分析所示,递归函数不一定是指数的。但是,它们往往在诸如 tree-walks 之类的事情上实际上很有用,它们会不可预测地分叉,在这种情况下,它们是指数级的(但更容易实现,并且与非递归函数一样好。)
标签: python algorithm recursion data-structures