我正在编写一个小片段来获取斐波那契数字序列,具体取决于用户输入。如果用户提供4作为输入,它应该返回Fibonacci序列的前N个成员。
#include <iostream>
using namespace std;
int main (){
int a = 0;
int b = 1;
int c;
int n = 3;
n -= 2;
if (n == 1){
cout << a << endl;
} else {
cout << a << b << endl;
for (int i=0;i<n;i++){
c = b + a;
cout << c << endl;
a = b;
b = c;
}
}
}
然而,无论我提供什么数字,我最终得到0作为输出。我有这个用PHP工作,我有点想念我犯错的地方。我想我实际上并没有正确地渲染输入和输出。
答案 0 :(得分:4)
int a =0;
int n = 3;
n -= 2;
if (n == 1){
cout << a << endl;
}
你有n
等于3,你减去2,因此n
等于1,所以你输入if body并输出a
,这是零。
[编辑]
您似乎没有得到任何输入 - 在您的程序中的评论中说明(您可以使用std::cin
或std::getline()
),但您可能意味着您有输入通过手动更改n
的值来进行硬编码。
您可能想要检查Fibonacci系列程序的工作方式:
在阅读上面提供的链接后,您应该能够看到您的代码应该更改为:
#include <iostream>
using namespace std;
int main (){
int a = 1;
int b = 0;
int c;
int n = 10; // "input" is 10
if (n == 0 || n == 1) { // 0 and 1 case
cout << n << endl;
} else {
for (int i = 2; i <= n; ++i) { // here you want to reach n
c = a + b;
b = a;
a = c;
}
cout << c << endl;
}
return 0;
}
但是,上面的代码只输出结果。你应该稍微修改它以获得序列的条款,但我会给你带来一些乐趣。
为了真正让用户输入数字,请更改:
int n = 10;
到
int n;
std::cout << "Please, input.\n";
std::cin >> n;
但是,让用户输入后必须验证输入。您看到用户可能无论是否在程序中提供输入,这可能会导致未定义的行为。
答案 1 :(得分:3)
您想要的序列是0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, ...
正如我在对另一个答案的评论中指出的那样,你的代码不会产生正确的Fibonacci序列。 F(3)不是你的代码的问题;问题是您在所有变量a
,b
,c
之间感到困惑,并将它们用于表示不同的事物。
您也错误地减少n
:您的代码在错误的位置执行,即使您将其移动到正确的位置,它也无助于操作n
去消极。
让我们稍微介绍一下你的代码:
int a = 0;
int b = 1;
int c;
int n = 3;
n -= 2;
嗯,这很奇怪。我们将n
设置为3然后立即减去2,使其为1.这意味着如果您尝试将n
设置为0,1或2,则最终n
为负数数。如果将其设置为3,则最终n
为1。
if (n == 1){
cout << a << endl;
}
我们在这里遇到了麻烦。请记住,您从n
中减去2,这意味着对于n==3
,您将返回a
中错误的内容。但即使你的意思是特殊情况F(1),代码仍然是错误的,因为F(1)= 1。
else {
cout << a << b << endl;
for (int i=0;i<n;i++){
请记住,我们可以使用n
零或负数来到这里。显然,在n <= 0
的情况下,此循环将永远不会执行,因此永远不会打印c
。
c = b + a;
cout << c << endl;
在这里,我们似乎通过添加前两个数字来计算并输出下一个斐波纳契数。这应该没问题。
a = b;
b = c;
在这里,我们保留新的Fibonacci数字及其前一个循环迭代,如果有的话。
此代码的问题当然是可以解决的。但问题是现有代码令人困惑。它输出各种不同的值,并且不清楚应该表示什么变量。
看看这个问题,你的第一直觉就是创建一个函数,接受一个数字n
作为输入并返回F(n) - 你可以称之为fib
或某些。
那么,如何编写这样的函数呢?这是一个简单的递归实现,您可以使用:
int fib(int n)
{
if ((n == 0) || (n == 1))
return n;
return fib(n-1) + fib(n-2);
}
注意这个功能如何简短,甜美,重点突出。不需要大量变量,不需要复杂的控制结构或存储状态。它几乎就像是对Fibonacci算法的基于文本的描述。
当然,它不是超级高效的,最终会重做很多工作。这是一种合理的批评,但这里的性能考虑不太可能。
不过,也许你只是不喜欢递归。许多人认为递归是一个肮脏的词,并以激情避免它。那么非递归实现呢?这是可能的,但它有点难以理解。
int fib (int n)
{
/* F(0) = 0 */
if (n == 0)
return 0;
int a = 0;
int b = 1;
for (int i = 2; i < n; i++)
{
int c = a + b;
a = b;
b = c;
}
/* F(n) = F(n-2) + F(n-1) */
return a + b;
}
这有点高效,而且难以理解。
我希望这有帮助。
答案 2 :(得分:0)
试试这个会给你所需的清单。
#include <iostream>
using namespace std;
int fib(int num){
int ans;
if (num >2) {
ans = fib(num-1) + fib(num-2);
}
else
ans = 1;
return ans;
}
int main()
{
int num, x=1;
cin >> num;
while (num >= x) {
cout << fib(x) <<" ";
x++;
}
return 0;
}