【问题引入】
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:=
=1,
=
+
(n ≥ 2,n ∈ N*)
用程序来输出斐波那契数列的前n项,每行m个数字,这里介绍两种方法,迭代法和递归法
【迭代法】
迭代法的思想是不断用旧值推出新值,恰好符合斐波那契数列=
+
的性质,因此,我们可以利用迭代法来实现
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int n,m; //输出数列前n项,每行m个
int a1=1,a2=1,a3; //a1,a2,a3分别是数列的第1,2,3项
cin>>n>>m;
cout<<setw(5)<<a1<<" "; //输出a1
cout<<setw(5)<<a2<<" "; //输出a2
for(int i=3;i<=n;i++) //从第三项开始,利用循环输出
{
a3=a1+a2; //第三项等于前两项之和
cout<<setw(5)<<a3<<" ";
if(i%m==0) //每输出m个数字就换行
cout<<endl;
a1=a2; //将前面两项记录,用于下次循环
a2=a3;
}
return 0;
}
补充一下,setw()用来控制输出字符长度的,默认为向右对齐,使用其须包含头文件"iomanip"
【递归法】
斐波那契数列的性质,容易和函数的递归调用联想起来,因此,也可以用递归的思想来完成这个程序
#include<iostream>
#include<iomanip>
using namespace std;
int fibo(int n) //定义一个函数,求斐波那契数列的第n项
{
if(n==1||n==2) //数列前两项均为1
return 1;
if(n>2) //从第三项开始,每一项都为前面的两项之和
return(fibo(n-1)+fibo(n-2));
}
int main()
{
int n,m; //输出前n项,每行m个数据
cin>>n>>m;
for(int i=1;i<=n;i++) //利用循环输出前n项
{
cout<<setw(5)<<fibo(i)<<" "; //"setw"设置字符宽度,向右对其
if(i%m==0) //每输出m个数据便换行
cout<<endl;
}
return 0;
}
此方法便使用了函数的递归调用,递归和迭代的思想也是程序设计常用的思想。