Big Theta绑定了2个递归调用

时间:2013-08-13 01:40:04

标签: python recursion big-o asymptotic-complexity big-theta

给定f(x, y)g(n)

def f(x, y):
    if x < 1 or y < 1:
        return 1
    return f(x - 1, y - 1) + f(x - 1, y - 1)

def g(n):
    return f(n, n)

g(n)的大Theta界限是什么?

我推断,因为x == y,f(x, y)中的条件永远不会成立,所以2次递归调用将决定复杂性。

仅考虑f(x - 1, y - 1):它需要n个递归调用才能到达基本情况,每个调用分支到另一个f(x - 1, y - 1)。在这一点上,我不知道如何继续。

(答案是Θ(2 n )。)

1 个答案:

答案 0 :(得分:1)

解决此问题的一种方法是为问题编写递归关系。如果您注意到,f的参数总是彼此相等(您可以看到这一点,因为它们在对g(n)的调用中起始相同,并且此时始终相等)。因此,我们可以编写一个递归关系T(n)来确定f(n,n)的运行时间。

那么T(n)会是什么?好吧,作为基本情况,T(0)将为1,因为只要n下降到0,函数就会执行一定量的工作。否则,函数会执行一定量的工作,然后对问题进行两次递归调用大小为n - 1.因此,我们得到这种复发:

  

T(0)= 1

     

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

看一下复发的条件,我们看到了一种模式:

  • T(0)= 1
  • T(1)= 3
  • T(2)= 7
  • T(3)= 15
  • T(4)= 31
  • ...
  • T(n)= 2 n + 1 -1

如果您愿意,可以使用归纳法正式证明这一点。由于T(n)由2 n + 1 - 1给出,因此运行时间为Θ(2 n )。

希望这有帮助!