我在Python中有两个递归函数,只是想知道它们的Big 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)
答案 0 :(得分:15)
让我们用递归关系来解决这个问题!第一个函数的运行时可以递归描述为
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)。
希望这有帮助!
答案 1 :(得分:7)
使用递归树查找费用(通过可视化图表)。
函数成本(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)
类似的方式我们可以找到第二个函数的时间复杂度。