C 递归函数的增长阶

C 递归函数的增长阶,c,recursion,time-complexity,C,Recursion,Time Complexity,以下问题是2001年GRE计算机科学考试中提出的 Q-67:考虑下面的 C代码< /强>。 intf(intx){ 如果(x我认为这可以简化为 f(x)>=f(x-1)+f(x-1)表示x>1, 因为当x>1时,g(x)=f(x-1)+g(x/2)>=f(x-1)。 第一个不等式就是f(x)>=2*f(x-1),从这里很容易得出f(x)>=2^x*f(1)(f的值每次x增长1,至少翻一番).Thank@Inspired.考虑到所有条件,最终递归关系如下:Thank@Inspired.考虑到所

以下问题是2001年GRE计算机科学考试中提出的

Q-67:考虑下面的<强> C代码< /强>。

intf(intx){

如果(x我认为这可以简化为
f(x)>=f(x-1)+f(x-1)表示x>1,
因为当x>1时,g(x)=f(x-1)+g(x/2)>=f(x-1)。

第一个不等式就是
f(x)>=2*f(x-1)
,从这里很容易得出
f(x)>=2^x*f(1)
f
的值每次
x
增长1,至少翻一番).

Thank@Inspired.考虑到所有条件,最终递归关系如下:Thank@Inspired.考虑到所有条件,最终递归关系如下:当x1时,f(x)=1.与f(x)增长唯一重要的关系是f(x)=2*f(x-1)+g(x/2)当x>1。按部分计算增长顺序时,我们会得到第一部分的O(2^x):2*f(x-1),但是第二部分呢:g(x/2)?我想
g(x/2)
会给我们一些关于
f(x/2)+f(x/4)+f(x/8)+……
的信息,它被
2*f(x/2)取代。
(正如我们所知,
f
的增长速度比线性函数快得多,对于线性函数,上界是
2*f(x/2)
)。因此最终的增长速度略高于O(2^x),但低于O(2^x+sqrt(2^x)),这在我看来仍然是指数型的。事实上,正如我们从第一部分分析中已经知道的那样,
f(x)
至少呈指数增长,并且当
g(x)>=0
时,即使不进行g(x/2)分析,我们也可以回答原始问题(问题中没有其他可能的选项)。终于找到了。再次感谢。
int f(int x) {
    if(x<1) {
        return 1;
    } else {
        return f(x-1)+g(x);
    }
}

int g(int x) {
    if(x<2) {
        return 1;
    } else {
        return f(x-1)+g(x/2);
    }   
}