【问题标题】:How many additional function calls does fib(n) require if "LINE 3" is removed?如果删除“LINE 3”,fib(n) 需要多少额外的函数调用?
【发布时间】:2011-01-27 03:12:33
【问题描述】:

我刚在面试中得到这个问题,不知道如何计算答案。
如果删除“LINE 3”,fib(n) 需要多少额外的函数调用?答案应该是关于 n 的。

int fib(int n) {
  if(n == 0) return 0;
  if(n == 1) return 1;
  if(n == 2) return 1; //LINE 3 HERE <---

  return fib(n - 1) + fib(n - 2);
}

【问题讨论】:

  • +1 问题看起来很无辜,但...
  • 问题与编程有关;但它的措辞可疑,就像家庭作业一样。总体 +0。
  • @Piskvor:我相信这个问题在面试中很容易被问到。

标签: algorithm complexity-theory fibonacci


【解决方案1】:

它可以很容易地计算出来。旧代码:

TO(0)=TO(1)=TO(2)=1
TO(n)=TO(n-1)+TO(n+2)+1

新代码:

TN(0)=TN(1)=1
TN(n)=TN(n-1)+TN(n-2)+1

简单地通过减去这两个来计算差异:

D(0)=D(1)=0
D(2)=3-1=2
D(n)=TN(n)-TO(n)=TN(n-1)+TN(n-2)+1-(TO(n-1)+TO(n+2)+1)
    =(TN(n-1)-TO(n-1))+(TN(n-2)-TN(n-2))+(1-1)
    =D(n-1)+D(n-2)

这意味着差异是以 0,0,2 开头的斐波那契数列。也可以为它计算一个闭式表达式。

【讨论】:

  • +1 太棒了。你这是从哪里学来的??我的意思是我想学习以这种方式分析程序! TN和TO是什么???你是个天才。这是你的答案@BROCK!!接受!!
  • 您可能已经提到封闭形式(就像原始斐波那契数列的封闭形式)是指数表达式,因此删除第 3 行的额外复杂性在 n中是指数的>。尽管如此,非常好的分析,这应该是这样做的。
  • @TheMachineCharmer:“你从哪里学来的?” – 这直接来自计算机科学入门课程。所以它是字面意思 CS 101。;-)
  • 哇,这实际上是一个很好的分析。而且我认为同样的推理方式也可以应用于其他递归算法。
【解决方案2】:

所需的额外调用次数也是斐波那契数列

0 0 2 2 4 6 10 16 26 42 68 110 178 288 466

#include<iostream>
using namespace std;

int a = 0;
int b = 0;

int fib(int n) {
    a++;
  if(n == 0) return 0;
  if(n == 1) return 1;
  if(n == 2) return 1; //LINE 3 HERE <---

  return fib(n - 1) + fib(n - 2);
} 

int fib1(int n) {
    b++;
  if(n == 0) return 0;
  if(n == 1) return 1;

  return fib1(n - 1) + fib1(n - 2);
}

int main(int argc, char* argv[])
{
    for(int i =0 ;i<15;i++)
    {
        fib(i);
        fib1(i);

        cout<<b-a<<" ";

        b = a = 0;
    }
}

注意:我认为这会是一些常数,但是...

【讨论】:

  • 那么,答案可以表示为... 2 * fib(n-2) ? :)
【解决方案3】:

假设没有第 3 行,计算 f(3):

f(3) = f(2) + f(1)
f(1) = 1
f(2) = f(1) + f(0)
f(0) = 0
f(1) = 1

现在计算 f(2) 需要 3 次调用。如果有第三行,那么这将在 1 次调用中完成。

这个算法的复杂度(没有第 3 行)是O(2^n)。当您添加第 3 行时,其中包含针对n = 2 的情况的显式解决方案,复杂性变为O(2^(n-1)) 等于(1/2) * O(2^n) = kO(2^n),其中系数 k = 0.5。如果为 n = 3 的情况添加显式解决方案,则得到 k = 0.25,依此类推。当您添加 p 显式解决方案时,复杂性将是:

    1
O (--- * 2^n)
   2^p 

这意味着,如果您将计算 n 从 1 到 n 的答案,并且如果您将保存所有计算出的解决方案,那么您将获得 p = n - 1 和每个 n 步骤的算法,复杂性将是2*O(n).

【讨论】:

  • 抱歉,这完全不准确
猜你喜欢
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 2020-11-18
  • 2011-06-18
  • 2021-09-11
  • 1970-01-01
相关资源
最近更新 更多