我在 Python 中有两个递归函数,只是想知道它们的大 O 表示法。每个这些的大 O 是什么?
def cost(n):
if n == 0:
return 1
else:
return cost(n-1) + cost(n-1)
def cost(n):
if n == 0:
return 1
else:
return 2*cost(n-1)
让我们使用递归关系来解决这个问题!第一个函数的运行时可以递归地描述为
T(0) = 1
T(n + 1) = 2T(n) + 1
也就是说,基本情况需要一个时间单位才能完成,否则我们对问题的较小实例进行两次递归调用,并进行一些设置和清理工作。展开这个递归中的一些项,我们得到
这个系列 1, 3, 7, 15, ... 可能看起来很熟悉,因为它是 2 1 - 1, 2 2 - 1, 2 3 - 1 等。更一般地,我们可以证明
T(n) = 2 n+1 - 1
我们可以通过归纳来做到这一点。作为我们的基本情况,T(0) = 1 = 2 1 - 1,因此对于 n = 0 的主张成立。现在假设对于某些 n,T(n) = 2 n+1 - 1。然后我们有
T(n + 1) = 2T(n) + 1 = 2(2 n+1 - 1) + 1 = 2 n+2 - 2 + 1 = 2 n+2 - 1
我们完成了!由于这个递归的结果是 2 n+1 - 1 = 2(2 n ) - 1,我们有运行时间是 Θ(2 n )。
第二个函数的运行时可以递归地描述为
T(0) = 1
T(n + 1) = T(n) + 1
扩展一些术语:
这给出了 1, 2, 3, 4, ...,所以更一般地说,我们可能会猜测
T(n) = n + 1
我们可以再次归纳证明这一点。作为基本情况,如果 n = 0,则 T(0) = 1 = 0 + 1。对于归纳步骤,假设对于某些 n,T(n) = n + 1。然后
T(n + 1) = T(n) + 1 = n + 1 + 1 = n + 2
我们完成了!由于运行时间为 n + 1,因此运行时间为 Θ(n)。
希望这可以帮助!
使用递归树(通过可视化图表)查找成本。
函数cost(n)的递推关系
T(n) = 2T(n-1)+c
If at kth level input size become 0 (base condition where func terminates)
n-k =0
k=n
Total cost of the function (adding cost of each level) :
T(n) = 2^0*c+ 2^1*c + 2^2*c + 2^3*c +.. .. . .+ 2^n * c
= O(2^n)
类似的方法我们可以找到第二个函数的时间复杂度。