【发布时间】:2012-03-28 13:32:26
【问题描述】:
我最近在 c++ 应用程序中编写了一个程序函数代码,用于计算斐波那契数列中的 F(n)。
无论如何,我无法让它使用递归产生正确的结果。例如,每当我输入值 5 时,它都会返回 8,如果我的其他程序代码返回正确的值 5。
这是我正在使用的功能......以及我从网上获得的代码。我遇到的问题是来自网络的代码和我的代码完全相同(几乎)但两者都给出了错误的值......
发生了什么事?
【问题讨论】:
我最近在 c++ 应用程序中编写了一个程序函数代码,用于计算斐波那契数列中的 F(n)。
无论如何,我无法让它使用递归产生正确的结果。例如,每当我输入值 5 时,它都会返回 8,如果我的其他程序代码返回正确的值 5。
这是我正在使用的功能......以及我从网上获得的代码。我遇到的问题是来自网络的代码和我的代码完全相同(几乎)但两者都给出了错误的值......
发生了什么事?
【问题讨论】:
嗯,简单来说,你的函数就是打印出以下系列:
1, 1, 2, 3, 5, 8 ...
因此,F(5) = 8(如果我们在这里谈论零索引)。如果要打印以下内容:
0, 1, 1, 2, 3, 5, 8 ...
OEIS 识别的序列是什么,那么您需要做的就是确保定义F(0) = 0。在这种情况下,您的功能应该是:
int FibiRec(int n) {
if (n == 0 || n == 1) {
return n; // IMPORTANT
} else {
return FibiRec(n-1) + FibiRec(n-2);
}
}
同时我想补充一点:你的函数有一个可怕的时间复杂度O(2^n)。使用您的函数,尝试生成第 40 个或第 100 个斐波那契数,您就会明白我在说什么。
【讨论】:
您的编号从 0 开始...而程序编号从 1 开始
n : 0, 1, 2, 3, 4, 5
F(n) : 1, 1, 2, 3, 5, 8
【讨论】:
我猜您需要在 if 循环中添加另一个条件 n==2...您的程序应该是...
int FibiRec(int n){
int result = 0;
if (n == 0 || n == 1 || n==2){
return 1;
}else{
return FibiRec(n-1) + FibiRec(n-2);
}
}
这是因为,对于 n=2,FibiRec(1) 和 FibiRec(0) 将被调用,这是您的停止条件......
【讨论】: