8

我在 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)
4

2 回答 2

15

让我们使用递归关系来解决这个问题!第一个函数的运行时可以递归地描述为

T(0) = 1

T(n + 1) = 2T(n) + 1

也就是说,基本情况需要一个时间单位才能完成,否则我们对问题的较小实例进行两次递归调用,并进行一些设置和清理工作。展开这个递归中的一些项,我们得到

  • T(0) = 1
  • T(1) = 2T(0) + 1 = 2 + 1 = 3
  • T(2) = 2T(1) + 1 = 2 × 3 + 1 = 7
  • T(3) = 2T(2) + 1 = 2 × 7 + 1 = 15

这个系列 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

扩展一些术语:

  • T(0) = 1
  • T(1) = T(0) + 1 = 1 + 1 = 2
  • T(2) = T(1) + 1 = 2 + 1 = 3
  • T(3) = T(2) + 1 = 3 + 1 = 4

这给出了 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)。

希望这可以帮助!

于 2013-04-20T00:20:26.877 回答
7

使用递归树(通过可视化图表)查找成本。

函数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)

类似的方法我们可以找到第二个函数的时间复杂度。

于 2013-04-20T03:56:55.607 回答