每个斐波那契数的递归调用次数

Number of recursion calls for each Fibonacci number

为什么我的代码输出中的数字与预期输出结果(粘贴在最后)之间存在差异?

我经历了这些与递归调用次数计算相关的问题:

我无法对我的问题形成正确的答案或解决方案。

我什至尝试通过在 for 循环之后的 main() 函数中或在函数定义中写入 call_count = 0; 来重新初始化计数(如第二个 link 的答案中所建议的那样)上面)但是,它没有工作或没有给我预期的输出。

我已将我的代码及其输出粘贴在下方,并将预期输出粘贴在我的代码输出下方。

#include <iostream>
#include "math.h"
#include <iomanip>

using namespace std;

int call_count = 0;

int fibo(int n)
{
    call_count+=1;
    if(n<=2)
    {
        return 1;
    }
    else {
            //call_count += 1;
            return fibo(n-1) + fibo(n-2);
         }
    return n;
}

int main()
{
    int num;
    cout<<"\nenter the number of integers to be printed in the fibonacci series\n";
    cin>>num;
    cout<<"\nfibonacci series for first "<<num<<" numbers is\n";
    cout<<"\n\nSerial Number\t"<<"FIBO_NUMBER\t"<<" NO_OF_CALLS MADE\n\n";
    for(int i=1;i<=num;i++)
    {
        cout<<endl<<i<<"th number\t   "<<fibo(i)<<"\t\t"<<call_count<<" calls\n";
    }
cout<<endl<<"\n the total number of recursive calls made were "<<call_count<<endl<<endl;
system("pause");
return 0;
}

我的代码的输出:

enter the number of integers to be printed in the fibonacci series
15

fibonacci series for first 15 numbers is

Serial Number   FIBO_NUMBER      NO_OF_CALLS MADE


1th number         1            0 calls

2th number         1            1 calls

3th number         2            2 calls

4th number         3            5 calls

5th number         5            10 calls

6th number         8            19 calls

7th number         13           34 calls

8th number         21           59 calls

9th number         34           100 calls

10th number        55           167 calls

11th number        89           276 calls

12th number        144          453 calls

13th number        233          740 calls

14th number        377          1205 calls

15th number        610          1958 calls


 the total number of recursive calls made were 3177

Press any key to continue . . .

而预期的输出数字如下:

1 th integer of fibonacci series is 1 and it needed 0 recursive calls
2 th integer of fibonacci series is 1 and it needed 0 recursive calls
3 th integer of fibonacci series is 2 and it needed 2 recursive calls
4 th integer of fibonacci series is 3 and it needed 4 recursive calls
5 th integer of fibonacci series is 5 and it needed 8 recursive calls
6 th integer of fibonacci series is 8 and it needed 14 recursive calls
7 th integer of fibonacci series is 13 and it needed 24 recursive calls
8 th integer of fibonacci series is 21 and it needed 40 recursive calls
9 th integer of fibonacci series is 34 and it needed 66 recursive calls
10 th integer of fibonacci series is 55 and it needed 108 recursive calls
11 th integer of fibonacci series is 89 and it needed 176 recursive calls
12 th integer of fibonacci series is 144 and it needed 286 recursive calls
13 th integer of fibonacci series is 233 and it needed 464 recursive calls
14 th integer of fibonacci series is 377 and it needed 752 recursive calls
15 th integer of fibonacci series is 610 and it needed 1218 recursive calls
Press any key to continue . . .

如何解决这种不匹配问题?

在调用 fibo() 方法之前将 call_count 重置为零。

#include <iostream>
#include "math.h"
#include <iomanip>

using namespace std;

int call_count = 0;

int fibo(int n)
{
    call_count+=1;
    if(n<=2)
    {
        return 1;
    }
    else {
            //call_count += 1;
            return fibo(n-1) + fibo(n-2);
         }
    return n;
}

int main()
{
    int num;
    cout<<"\nenter the number of integers to be printed in the fibonacci series\n";
    cin>>num;
    cout<<"\nfibonacci series for first "<<num<<" numbers is\n";
    cout<<"\n\nSerial Number\t"<<"FIBO_NUMBER\t"<<" NO_OF_CALLS MADE\n\n";
    for(int i=1;i<=num;i++)
    {
        call_count = 0; 
        cout<<endl<<i<<"th number\t   "<<fibo(i)<<"\t\t"<<call_count<<" calls\n";
    }
    cout<<endl<<"\n the total number of recursive calls made were "    <<call_count<<endl<<endl;
    system("pause");
    return 0;
}

根据@rlbond 和@zeroCool 的精确输入进行集体总结,并对两者进行微小的更改以形成一个答案:-

在每次循环迭代时将 call_count 重置为零,并在调用 fibo 的单独语句中打印 call_count (因为它可以在调用点进行评估),将产生预期的输出。 还需要从 call_count 中减去 1(对于初始调用),同时打印出每个斐波那契数的计数语句以获得预期计数。

以下代码减少了对额外变量的需求,并将评估为预期输出的打印语句拆分。 (或者可以参考 rlbond 对上述问题的评论中的 link。ideone.com/8EWjOC

#include <iostream>
#include "math.h"
#include <iomanip>

using namespace std;

int call_count = 0;

int fibo(int n)
{
    call_count+=1;
    if(n<=2)
    {
        return 1;
    }
    else {
            return fibo(n-1) + fibo(n-2);
         }
    return n;
}

int main()
{
    int num;
    cout<<"\nenter the number of integers to be printed in the fibonacci series\n";
    cin>>num;
    cout<<"\nfibonacci series for first "<<num<<" numbers is\n";
    cout<<"\n\nSerial Number\t"<<"FIBO_NUMBER\t"<<" NO_OF_CALLS MADE\n\n";
    for(int i=1;i<=num;i++)
    {
        call_count = 0;
        cout<<endl<<i<<"th number\t   "<<fibo(i)<<"\t\t";
        cout<<call_count-1<<" calls\n";
    }
cout<<endl<<"\n the total number of recursive calls made were "<<call_count-1<<endl<<endl;
system("pause");
return 0;
}


运行正常,输出如下:-

输入斐波那契数列中要打印的整数个数 15

前 15 个数字的斐波那契数列是

序列号FIBO_NUMBERNO_OF_CALLS制造

第1个号码1 0个电话

第2个号码1 0个电话

第3个号码2 2个电话

第4个号码3 4个电话

第5个号码5 8个电话

第6号8号14次

第7号13 24来电

8号21 40来电

第9号34 66来电

10号55108来电

11号89176来电

第12号144286来电

第13号233464来电

第14号377752次来电

第15号610 1218来电

递归调用总数为1218

按任意键继续。 . .



感谢大家的付出