• 斐波拉契数列


    斐波拉契数列的元素是:1,1,2,3,5,8,13,…等

    本例中以四种不同的方式来实现:

    方法1:递归方法实现

    代码:

    #include<iostream>

    #include<cmath>

    using namespace std;

    int f1(int i)

    {

                      if (i == 0 || i == 1)

                      {

                                return 1;

                      }

                      else

                      {

                                return f1(i - 1) + f1(i - 2);

                      }

    }

    int main()

    {

             cout << "=============使用递归算法============";

             const int n =20;

             int f[n] = { 1, 1 };

             int i = 0;

             for (i = 2; i < n; i++)

             {

                       f[i] = f1(i);

             }

             print(f, n);

             return 0;

    结果:

     

    在本段代码中,我们定义了一个计算斐波拉契数列各项元素的函数,然后将这个函数的返回值赋值给存放斐波拉契数列元素的一个数组。斐波拉契数列的特点是:从第三项开始,每一项都等于前两项之和。因此,当项数为1,2时,即数组中下标为0,1时,返回值为1,这就是斐波拉契数列的前两项。当项数大于2时,每一项等于前两项之和,返回值为f1(i - 1) + f1(i - 2)。上述就是用递归来实现斐波拉契数列的方法,不难发现,在递归的过程中,有很多重复性计算的项,程序的效率很低。我们来看下面一种方法。

    方法2:

    代码:

    #include<iostream>

    #include<cmath>

    using namespace std;

    int main()

    {

    int f[n] = { 1, 1 };

             int i = 0;

             for (i = 2; i < n; i++)

             {

                       f[i] = f[i - 1] + f[i -2];

             }

             print(f, n);

    return 0;

    }

    结果:

     

    在这种方法中,我们采用了通过循环来计算斐波拉契数列的各项。我们预先定义了前两项分别为1,1。从第三项开始,每一项等于前两项之和,逐次地计算出第3项,第4项,直到第20项。相比于递归,这种方法效率更高。

    方法3:通项公式法

    代码:

    #include<iostream>

    #include<cmath>

    using namespace std;

    int f2(int i)

    {

             int temp;

             double v1, v2;

             v1 = (sqrt(5) + 1) / 2, v2 = (1 - sqrt(5)) / 2;

             temp = (powl(v1, i+1) - powl(v2, i+1)) / sqrt(5);

             return temp;

    }

    int main()

    {

             cout << "=============使用通项公式============";

             for (i = 0; i < n; i++)

             {

                       f[i] = f2(i);

             }

             print(f, n);

             return 0;

    }

    结果:

     

    斐波拉契数列数列的通项公式为:

    ,使用这个公式可以直接计算出数列的每一项。关于这个公式的推导可以有多种方法,这里不细表。

    方法4:使用矩阵计算

    斐波拉契数列可以写成如下形式:

    因此,可以利用二维数组来计算和表示斐波拉契数列。

    代码:

    #include<iostream>

    #include<cmath>

    using namespace std;

             void f3(int a[], int n)

    {

                      int m1[2][2] = { { 1, 1 }, { 1, 0 } };

                      int m2[2][2] = { { 3, 2 }, { 1, 1 } };

                      int m3[2][2] = { 0, 0, 0, 0 };

                      for (int k = 2; k < n - 2; k++)

                      {

                                m3[0][0] = m2[0][0] * m1[0][0] + m2[0][1] * m1[1][0];

                                m3[0][1] = m2[0][0] * m1[0][1] + m2[0][1] * m1[1][1];

                                m3[1][0] = m2[1][0] * m1[0][0] + m2[1][1] * m1[1][0];

                                m3[1][1] = m2[1][0] * m1[0][1] + m2[1][1] * m1[1][1];

                                a[k] = m3[1][0];

                                a[k + 1] = m3[0][1];

                                a[k + 2] = m3[0][0];

                                for (int i = 0; i < 2; i++)

                                {

                                         for (int j = 0; j < 2; j++)

                                         m2[i][j] = m3[i][j];

                                }

                      }

    }

    int main()

    {

           const int n =20;

      int f[n] = { 1, 1 };

      int i = 0;

      cout << "=============使用矩阵乘法============";

      f3(f, n);

      print(f, n);

      return 0;

    }

    结果:

     

    如式(n>=3)所示,每次可以根据这个公式计算出一个矩阵,然后将其赋值给矩阵m2,计算下一项时,用m2与矩阵相乘。如结果所示,这样同样能够得到斐波拉契数列。

  • 相关阅读:
    C#类继承情况下构造函数的执行过程
    vs快捷键大全(分类导航)
    vs常用快捷键
    Entity Framework实体无限循环问题
    entity framework实现left join功能
    理解requireJS-实现一个简单的模块加载器
    petshop4.0(王福朋)
    代码覆盖率工具 Istanbul 入门教程
    .net微信开发
    numpy的用法(一)
  • 原文地址:https://www.cnblogs.com/puheng/p/9123679.html
Copyright © 2020-2023  润新知