【问题标题】:How do I fix this Fibonacci Sequence?如何修复这个斐波那契数列?
【发布时间】:2016-02-11 11:20:34
【问题描述】:

我编写了这个 C++ 程序,它假设要执行斐波那契数列。问题一旦我通过 8 序列就变坏了,就像不是最后一个数字它搞砸了,我不知道如何解释它,只是阅读源代码,但请帮助我,非常感谢。

#include <iostream>
#include <unistd.h>
using namespace std;

int main()
{
    sleep(3);
    cout << "Doing The Fibonacci Sequence"; sleep(5);
    cout << ""<<endl;
    for (int num=1; num <= 8; num++)
    {
        /*int number, lastnum;
          lastnum = num - 1;
          number = num + lastnum;
          cout << number<<endl;
        */
        for(int i=1; i <= 8; i++)
        {
            //cout << num << "+" << i <<endl;
            int numb = num+i;
            int nun  = numb - 1;
            int c = nun + i;
            cout << nun << " + " << i << " = " << c <<endl;
            num ++;
        }

    }
    return 0;
}

/*The Output
  Doing The Fibonacci Sequence
1 + 1 = 2
3 + 2 = 5
5 + 3 = 8
7 + 4 = 11
9 + 5 = 14
11 + 6 = 17
13 + 7 = 20
15 + 8 = 23

*/

【问题讨论】:

  • 欢迎来到 Stack Overflow!听起来您可能需要学习如何使用调试器来逐步执行代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programs.

标签: c++ fibonacci


【解决方案1】:
#include <iostream>
//#include <unistd.h> 
using namespace std;

int main()
{
    //sleep(3);
    int number;
    cout << "Doing The Fibonacci Sequence"; //sleep(5);
    cout << ""<<endl;
    cin>>number;
    int a=1;
    int b=1;

    for (int num=1; num < number-1; num++)
    {
        int c=a+b;
        cout << a << " + " << b << " = " << c <<endl;
        a=b;
        b=c;
    }
    return 0;
}

输出

Doing The Fibonacci Sequence

8
1 + 1 = 2
1 + 2 = 3
2 + 3 = 5
3 + 5 = 8
5 + 8 = 13
8 + 13 = 21

检查代码,看看它可能会回答您的问题。

【讨论】:

  • 要获得第 n 个(说 'c')术语,我们将使用和 (n-2)th(说 'a')和 (n-1)th(说 'b')术语。所以 a=b ,b=c 意味着现在对于下一个 (n+1)th ,我们将使用 nth 和 (n-1)th 项..所以对于下一次迭代 'c' 将用作 'b' 和 'b ' 将变为 'a' 以计算新的 'c'。我们分配先前的变量(a 和 b)以在下一次迭代中计算新值。
【解决方案2】:

实际上你的序列在第二次迭代时已经很糟糕了,应该是 1 + 2 = 3。至于如何修复它......斐波那契数是递归的经典例子,所以使用它:

#include <iostream>
using namespace std;

void fib (int left, int right, int iterations) {
    if (iterations > 0) {
        cout << left << " + " << right << " = " << left + right << endl;
        fib (right, left + right, iterations - 1);
    }
}

int main () {
    cout << "Doing The Fibonacci Sequence" << endl;
    fib (1, 1, 8);
    return 0;
}

之所以有效,是因为从数学上讲,序列中的每个连续值都是根据其前身定义的。代码只是遵循这种模式。这种(根据自身定义事物)技术称为“递归”,很多人都遇到了麻烦。

第一次调用(在 main 中)设置初始值(1 和 1)和迭代次数(8)。该函数本身打印这些值加上它们的总和(到目前为止很简单,对吗?),然后通过调用 itself 并使用适当的值开始下一次迭代。 if 语句是必要的,以确保我们在正确的迭代次数后停止。

如果你不明白这一点,只需按照控制流程(也许写在一张纸上):首先我们调用 fib(1,1,8),下一个调用将是 fib(1,2, 7),然后是 fib (2,3,6),然后是 fib (3,5,5),直到最后一个参数的值为零。希望这可以帮助!

【讨论】:

  • 它可以工作,但是你能向我解释一下,这个函数是如何工作的吗?
猜你喜欢
  • 2015-06-05
  • 2011-05-06
  • 1970-01-01
  • 2016-04-21
  • 2013-08-03
  • 2014-05-19
  • 2015-08-30
相关资源
最近更新 更多