我们正在用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)
答案 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系列,但算法具有相同的复杂性。