让我们使用递归关系来解决这个问题!第一个函数的运行时可以递归描述为
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, ... 可能看起来很眼熟,因为它是 21 - 1, 22 - 1, 2 3 - 1 等。更一般地,我们可以证明
T(n) = 2n+1 - 1
我们可以通过归纳来做到这一点。作为我们的基本情况,T(0) = 1 = 21 - 1,因此对于 n = 0,该声明成立。现在假设对于某些 n,T(n) = 2n +1 - 1. 然后我们就有了
T(n + 1) = 2T(n) + 1 = 2(2n+1 - 1) + 1 = 2n+2 - 2 + 1 = 2n+2 - 1
我们完成了!由于这个循环的结果是 2n+1 - 1 = 2(2n) - 1,我们有运行时间是 Θ(2n支持>)。
第二个函数的运行时间可以递归描述为
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)。
希望这会有所帮助!