调用另一个递归函数的递归函数的运行时分析

时间:2014-03-08 13:43:06

标签: c recursion big-o computer-science code-analysis

int f(int x)
{
  if (x < 1) return 1;

  return f(x-1) + g(x);
}


int g(int x)
{
  if (x < 2) return 1;

  return f(x-1) + g(x/2)
}

f的大O是什么?更重要的是,使用什么技术来计算这样的问题的运行时间?

1 个答案:

答案 0 :(得分:2)

允许写Cf(x)(resp Cg(x))调用f(x)(resp g(x))时执行的添加次数。

首先,两个函数都返回一些数字,这些数字是通过加法返回最终得到的1.因此

Cf(x) = f(x) - 1
Cg(x) = g(x) - 1

所以让我们坚持f和g。以下是前几个值:

[(f(i), g(i), 2^i) for i in range(10)]
[(1, 1, 1),
 (2, 1, 2),
 (5, 3, 4),
 (11, 6, 8),
 (25, 14, 16),
 (53, 28, 32),
 (112, 59, 64),
 (230, 118, 128),
 (474, 244, 256),
 (962, 488, 512)]

看起来呈指数级。此外:

f(x) = f(x-1) + g(x) 
     = 2*f(x-1) + g(x/2)

这清楚地表明

f(x) > 2*f(x-1) > 4*f(x-2) > 8*f(x-3) > 2^x. 

所以你很好地认为f(x)O(2^x),实际上是Theta(2^x)

现在f(x) > 2^xf(x-1) <= g(x) <= f(x)。因此gf以相同的速度增长。 因此g(x/2)f(x)相比完全可以忽略不计。那么

f(x) is a O(2^n)