for循环中递归的时间复杂度

时间:2016-05-16 18:49:53

标签: time-complexity

func(n){
 if(n == 0){
   //print sth
   return;
 } 
 for(i=1;i<=6;i++){
   func(n-1)
 }
}   

请帮助我理解上面伪代码的时间复杂性。

1 个答案:

答案 0 :(得分:3)

您的递归代码具有以下属性:

  • 当您使用参数0调用该函数时,它会执行一定量的工作,然后返回。
  • 使用参数n&gt;调用函数时0,它执行一定量的工作,并对大小为n - 1的问题进行六次递归调用。

在数学上,我们可以将完成的总工作建模为递归关系,让T(n)表示调用func(n)时完成的工作量:

  • T(0)= 1
  • T(n)= 6T(n-1)+ 1

让我们一起玩这个,看看我们发现了什么。

  • T(0)= 1。
  • T(1)= 6T(0)+ 1 = 6 + 1 = 7.
  • T(2)= 6T(1)+ 1 = 6(7)+ 1 = 43。
  • T(3)= 6T(2)+ 1 = 6(43)+ 1 = 259.
  • T(4)= 6T(3)+ 1 = 6(259)+ 1 = 1555.

通过观察这一点可能并不明显,这里的数字实际上是由公式

给出的
  

T(n)=(6 n + 1 -1)/ 5

我们可以简要地查看如下:

  • T(0)=(6 1 - 1)/ 5 = 5/5 = 1.
  • T(1)=(6 2 - 1)/ 5 = 35/5 = 7.
  • T(2)=(6 3 - 1)/ 5 = 215/5 = 43.

渐近地,这意味着T(n)=Θ(6 n ),因此总运行时间为Θ(6 n )。

那么...(6 n + 1 - 1)/ 5来自哪里?注意

  • T(0)= 1
  • T(1)= 6·1 + 1
  • T(2)= 6 2 ·1 + 6·1 + 1
  • T(3)= 6 3 ·1 + 6 2 ·1 + 6·1 + 1

更一般地说,T(n)似乎具有

形式
  

6 n + 6 n-1 + ... + 6 1 + 6 0 。< / p>

这是几何级数的总和,简化为(6 n + 1 - 1)/ 5。