递归的替代方法

时间:2018-12-18 03:08:34

标签: recursion

我最近在理解解决递归的替代方法时遇到了麻烦。我很少看关于该问题的在线讲座,但可悲的是它并没有告诉我太多(在其中一个中,我听说这是基于猜测的,这使我更加困惑),并且我正在寻找一些技巧。我的目标是使用替换方法解决三个不同的递归函数,找出它们的时间复杂度和T(32)的值。

  

功能1 定义为:
  T(1)= 1
  T(n)= T(n-1)+ n等于n> 1

我首先列出了前几次处决:

T(2) = T(2-1)+2 = 1+2
T(3) = T(3-1)+3 = 1+2+3
T(4) = T(4-1)+4 = 1+2+3+4
T(5) = T(5-1)+5 = 1+2+3+4+5
...
T(n) = 1+2+...+(n-1)+n = n(n+1)/2

然后我通过归纳证明,使用第一个 n 个自然数之和的公式, T(1)= 1 ,然后对于 n + 1 。对我来说很清楚,但是我不确定这是否是替代方法。还知道公式 T(n)= n(n + 1)/ 2 ,我很容易计算出T(32)= 528并计算了时间复杂度,即O(n ^ 2)。

在示例(2)(3)中,我只需要 n = 2 ^ k 的解决方案当 k 是自然数时,但是如果您向我推荐了一些文章,也说明了如何为所有 n 获取这些信息,那会很好(但是我想这要困难得多)比那)。

  

功能2 定义为:
  T(1)= 0
  T(n)= T(n / 2)+ 1,即使n> 1
  对于奇数n> 1的T(n)= T((n + 1)/ 2)+1

由于只允许对 n = 2 ^ k 进行证明,因此根据我所获得的知识,我尝试通过以下方式进行验证:

T(n) = T(n/2) + 1
     = T(n/4) + 1 + 1     = T(n/4) + 2
     = T(n/8) + 1 + 2     = T(n/8) + 3
     = T(n/16) + 1 + 3    = T(n/16) + 4
     = T(n/2^i) + i     // where i <= k, according to tutorials

这是我被困住的时刻,我无法继续进行下去。我想我的计算是正确的,但是我不确定如何寻找一个满足该功能的公式。得到正确的公式后,计算T(32)或时间复杂度将不是问题。

  

功能3 定义为:
  T(1)= 1
  T(n)= 2T(n / 2)+ 1,即使n> 1
  对于奇数n> 1,T(n)= T((n – 1)/ 2)+ T((n + 1)/ 2)+ 1

我的计算:

T(n) = 2T(n/2) + 1
     = 2(2T(n/4)+1) + 1 = 4T(n/4) + 3
     = 4(2T(n/8)+1) + 3 = 8T(n/8) + 7
     = iT(n/2^i) + 2^i - 1

再次涉及公式,我不确定该如何重写。

基本上,用替代方法求解递归是否意味着寻找和迭代公式?

1 个答案:

答案 0 :(得分:0)

在重新研究了该主题之后,我发现自己做错了什么,并且没有让我的问题没有得到回答,我会尽力做到这一点。

第一个函数计算正确,归纳证明也是正确的-在此无需添加任何内容。

  

当我遇到第二功能时,我没有   请注意,我实际上正在使用替换 n = 2 ^ k 。这个   应该是这样的:

T(n) = T(n/2) + 1
     = T(n/4) + 1 + 1     = T(n/4) + 2
     = T(n/8) + 1 + 2     = T(n/8) + 3
     = T(n/16) + 1 + 3    = T(n/16) + 4
     = T(n/2^k) + k 
     = T(1) + k 
     = k

归纳证明 T(2 ^ k)= k 有效:
基本情况: k = 1,则T(2 ^ 1)= T(2)=1。(它不能为k = 0,因为2 ^ 0不大于1)
归纳步骤: 假设T(2 ^ k)= k,我们想显示T(2 ^(k + 1))= k + 1。由于 2 ^ k = n ,则 2 ^(k + 1)= 2 * 2 ^ k = 2n

T(2n) = T(n) + 1
      = T(n/2) + 1 + 1
      = T(n/4) + 2 + 1
      = T(n/8) + 3 + 1
      = T(1) + k + 1
      = k + 1.

时间复杂度: O(log n)
T(32) = T(2 ^ 5)= 5

  

第三个功能中,我每次都错过了该功能   本身的价值就翻了一番。

T(n) = 2T(n/2) + 1
     = 2(2T(n/4)+1) + 1     = 4T(n/4) + 3
     = 4(2T(n/8)+1) + 3     = 8T(n/8) + 7
     = 8(2T(n/16)+1) + 7    = 16T(n/16) + 15
     = 16(2T(n/32)+1) + 15  = 32T(n/32) + 31
     = 2^k*T(n/2^i) + 2^k - 1
     = 2^k*T(1) + 2^k - 1
     = 2^k + 2^k - 1
     = 2^(k+1) - 1

归纳证明 T(2 ^ k)= 2 ^(k + 1)-1 起作用:
基本情况: k = 1,则T(2 ^ 1)= T(2)=3。原始函数T(2)= 2T(1)+1 = 2 + 1 = 3,所以基本情况为真。
归纳步骤: 假设T(2 ^ k)= 2 ^(k + 1)-1,我们要显示T(2 ^(k + 1))= 2 ^(k + 2)-1。类似地,与第二个函数一样, 2 ^ k = n ,所以 2 ^(k + 1)= 2 * 2 ^ k = 2n

T(2n) = 2T(n) + 1
      = 2(2T(n/2)+1) + 1    = 4T(n/2) + 3
      = 4(2T(n/4)+1) + 1    = 8T(n/4) + 7
      = 8(2T(n/8)+1) + 1    = 16T(n/8) + 15
      = 2^(k+1) + 2^(k+1) - 1
      = 2*2^(k+1) - 1
      = 2^(k+2) - 1.

我们还可以看一下T(n)的前几个元素,分别是1、3、5、7、9等,因此T(n)= 2n-1

时间复杂度: O(n)
T(32) = T(2 ^ 5)= 2 ^(5 + 1)-1 = 64-1 = 63