斐波拉契数列

斐波拉契数列的元素是: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与矩阵相乘。如结果所示,这样同样能够得到斐波拉契数列。

猜你喜欢

转载自www.cnblogs.com/puheng/p/9123679.html
今日推荐