无法打印Fibonacci系列

时间:2014-06-21 17:43:10

标签: c++ fibonacci

我正在编写一个小片段来获取斐波那契数字序列,具体取决于用户输入。如果用户提供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工作,我有点想念我犯错的地方。我想我实际上并没有正确地渲染输入和输出。

3 个答案:

答案 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::cinstd::getline()),但您可能意味着您有输入通过手动更改n的值来进行硬编码。

您可能想要检查Fibonacci系列程序的工作方式:

  1. Fib. at Rosseta page.
  2. Fib. with recursion
  3. Non-recursive Fib.
  4. 在阅读上面提供的链接后,您应该能够看到您的代码应该更改为:

    #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;
    

    但是,让用户输入后必须验证输入。您看到用户可能无论是否在程序中提供输入,这可能会导致未定义的行为。 enter image description here

答案 1 :(得分:3)

您想要的序列是0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, ...

正如我在对另一个答案的评论中指出的那样,你的代码会产生正确的Fibonacci序列。 F(3)不是你的代码的问题;问题是您在所有变量abc之间感到困惑,并将它们用于表示不同的事物。

您也错误地减少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;
}