C 调用另一个递归函数的递归函数的运行时分析 intf(intx) { 如果(x2*f(x-1)的关系,并展示了当n线性接近底部时,增长因子是指数的。我已经有10年没有在教室里看到这些了,但我不记得做过这种特殊的分析。当然,所有简单的问题都会在采访中出现(运行时排序或BFS/DFS等),但这是我第一次遇到这样的问题。再次感谢你。 f(x) > 2*f(x-1) > 4*f(x-2) > 8*f(x-3) > 2^x. f(x) is a O(2^n)

C 调用另一个递归函数的递归函数的运行时分析 intf(intx) { 如果(x2*f(x-1)的关系,并展示了当n线性接近底部时,增长因子是指数的。我已经有10年没有在教室里看到这些了,但我不记得做过这种特殊的分析。当然,所有简单的问题都会在采访中出现(运行时排序或BFS/DFS等),但这是我第一次遇到这样的问题。再次感谢你。 f(x) > 2*f(x-1) > 4*f(x-2) > 8*f(x-3) > 2^x. f(x) is a O(2^n),c,recursion,big-o,computer-science,code-analysis,C,Recursion,Big O,Computer Science,Code Analysis,f的大O是什么?更重要的是,使用什么技术来计算此类问题的运行时间?让我们编写Cf(x)(respCg(x))调用f(x)(respg(x))时执行的加法次数 首先,这两个函数都返回一些数字,这些数字通过加法最终返回到1。所以 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是什么?更重要的是,使用什么技术来计算此类问题的运行时间?

让我们编写
Cf(x)
(resp
Cg(x)
)调用
f(x)
(resp
g(x)
)时执行的加法次数

首先,这两个函数都返回一些数字,这些数字通过加法最终返回到1。所以

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和g。以下是前几个值:

Cf(x) = f(x) - 1
Cg(x) = g(x) - 1
看起来是指数级的。此外:

[(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)
是一个
O(2^x)
,实际上是一个
Theta(2^x)


现在
f(x)>2^x
f(x-1)对我来说就像是家庭作业!你介意分享你的任何尝试吗?你在课堂上做什么?@RontogiannisAristofanis家庭作业问题没有问题。这是一个面试问题。如果是作业,我就不需要在这里问了。:)谢谢你问这个问题。使我在Pascal编译器中实现了“相互递归”类型的前向声明非常感谢。我想这里对我来说关键是你打破了f(x)>2*f(x-1)的关系,并展示了当n线性接近底部时,增长因子是指数的。我已经有10年没有在教室里看到这些了,但我不记得做过这种特殊的分析。当然,所有简单的问题都会在采访中出现(运行时排序或BFS/DFS等),但这是我第一次遇到这样的问题。再次感谢你。
f(x) > 2*f(x-1) > 4*f(x-2) > 8*f(x-3) > 2^x. 
f(x) is a O(2^n)