【问题标题】:Runtime analysis of a recursive function that calls another recursive function调用另一个递归函数的递归函数的运行时分析
【发布时间】:2014-03-08 13:43:05
【问题描述】:
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?更重要的是,使用什么技术来计算此类问题的运行时间?

【问题讨论】:

  • 对我来说好像是作业!你介意分享一下尝试吗?
  • 你在课堂上做什么?
  • @RontogiannisAristofanis 作业问题没有错。
  • 这是一道面试题。如果是作业,我就不需要在这里问了。 :)
  • 感谢您提出这个问题。让我在我的 Pascal 编译器中实现“相互递归”类型的前向声明。 ;)

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


【解决方案1】:

让我们写Cf(x)(对应Cg(x))调用f(x)(对应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) &gt; 2^xf(x-1) &lt;= g(x) &lt;= f(x)。这样gf 以相同的速度增长。 因此,g(x/2)f(x) 相比完全可以忽略不计。这样

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

【讨论】:

  • 谢谢。我认为这里的关键是你打破了 f(x) > 2*f(x-1) 的关系,并展示了当 n 线性接近底部时,增长因子是指数级的。自从我在课堂上看到这些已经过去了大约 10 年,但我不记得做过这种特殊的分析。当然,所有简单的面试都会出现在面试中(运行时排序或 BFS/DFS 等),但这是我第一次遇到这样的面试。再次感谢您。
猜你喜欢
  • 2012-08-29
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
相关资源
最近更新 更多