递归中的大Theta

时间:2018-04-13 23:48:49

标签: c

我们正在用C编程作为我们学期的一部分,这是一个colloquim测试问题的例子:

unsigned f(unsigned n) {
if(n<=1) return 1;
return f(n-2)+f(n-2);
}

如果我为f(4)调用它,那么堆栈帧如何查找此函数?它的Big Theta是什么(确实返回f(n-2)+ f(n-2)计数为2次调用相同的功能或1)

1 个答案:

答案 0 :(得分:1)

问题&#34;堆栈框架是什么样的?&#34;没有一个答案。答案取决于我们在什么时候看堆栈框架。

调用序列如下所示:

f(4)
  f(2)
    f(0)
    f(0)
  f(2)
    f(0)
    f(0)

如果我们在n <= 1并且调用f(4)时返回时设置断点,我们会在上面的序列中第一次调用f(0)内点击断点。堆栈帧看起来像这样(假设堆栈从分配帧的顶部向下增长,我们将内存从SP转储到顺序更高的内存,这两者都是典型的):

0
PC of f(0) call
2
PC of f(2) call
4
PC of f(4) call

对于这个功能,bigO和big theta一样,我相信Mike P说得对:2 ^(n / 2)。要了解原因,请尝试编写f(6)f(8)的调用序列,并希望您能看到该模式:每次向参数添加两个时,调用次数都会翻倍。

如需更完整的答案,请参阅Computational complexity of Fibonacci Sequence。这不是Fibonacci系列,但算法具有相同的复杂性。