斐波那契(Fibonacci1170-1250),意大利最杰出的数学家。其父为比萨的商人,他认为数学是有用的,因此送斐波那契向阿拉伯教师们学习数学,掌握了印度数码之一新的记数体系,后来游历埃及、叙利亚、希腊、西西里、法国等地,掌握了不同国家和地区商业的算术体系,1200年回答比萨,潜心研究数学,1202年写成《算盘全集》,此书广为流传,为在欧洲传播印度-阿拉伯数码起了重要的作用。
1228斐波那契在修订《算盘全集》修订本中,增加了一道非常有名的兔子繁殖问题,问题是这样的:如果一对兔子每月生一对兔子;一对新生兔,从第二个月起就开始生兔子;假定每对兔子都是一雌一雄,试问一对兔子,一年能繁殖成多少对兔子?
先看前几个月的情况:第一个月有一对刚出生的兔子,即F(1)=1;第二个月,这对兔子长成成年兔,即F(2)=1;第三个月,这对成年兔生出一对小兔,共有两对兔子,即F(3)=2;第四个月,成年兔又生出一对小兔,原出生的兔子长成成年兔,共有三对兔子,即F(4)=3;第五个月,原成年兔又生出一对小兔,新成年兔也生出一对小兔,共有五对兔子,即F(5)=5;……以此类推,可得每个月的兔子对数,组成数列:1,1,2,3,5,8,13,21,34,55,89,144,…,这就是著名的斐波那契数列,其中的任一个数,都叫斐波那契数。
题中本质上有两类兔子:一类是能生殖的兔子,称为成年兔子;新生的兔子不能生殖;新生兔子一个月就长成成年兔子。求的是成年兔子与新生兔子的总和。每月新生兔对数等于上月成年兔对数。每月成年兔对数等于上个月成年兔对数与新生兔对数之和。最后得关系式:
F(1)=F(2)=1;
1228斐波那契在修订《算盘全集》修订本中,增加了一道非常有名的兔子繁殖问题,问题是这样的:如果一对兔子每月生一对兔子;一对新生兔,从第二个月起就开始生兔子;假定每对兔子都是一雌一雄,试问一对兔子,一年能繁殖成多少对兔子?
先看前几个月的情况:第一个月有一对刚出生的兔子,即F(1)=1;第二个月,这对兔子长成成年兔,即F(2)=1;第三个月,这对成年兔生出一对小兔,共有两对兔子,即F(3)=2;第四个月,成年兔又生出一对小兔,原出生的兔子长成成年兔,共有三对兔子,即F(4)=3;第五个月,原成年兔又生出一对小兔,新成年兔也生出一对小兔,共有五对兔子,即F(5)=5;……以此类推,可得每个月的兔子对数,组成数列:1,1,2,3,5,8,13,21,34,55,89,144,…,这就是著名的斐波那契数列,其中的任一个数,都叫斐波那契数。
题中本质上有两类兔子:一类是能生殖的兔子,称为成年兔子;新生的兔子不能生殖;新生兔子一个月就长成成年兔子。求的是成年兔子与新生兔子的总和。每月新生兔对数等于上月成年兔对数。每月成年兔对数等于上个月成年兔对数与新生兔对数之和。最后得关系式:
F(1)=F(2)=1;
F(n)=F(n-1)+F(n-2) (n≥3)
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
unsigned long long f1,f2;
int i;
f1=f2=1;
for(i=1;i<20;i++)
{
cout<<setw(12)<<f1<<setw(12)<<f2;
if(i%2==0)
<span style="white-space:pre"> </span> cout<<endl;
f1=f1+f2;
f2=f2+f1;
}
cout<<endl;
return 0;
}
#include<iostream>
#include<time.h>
using namespace std;
unsigned long long Fibonacci1(int n)
{
if (n == 0)
return 0;
else if (n == 1)
return 1;
else if (n > 1)
return Fibonacci1 (n - 1) + Fibonacci1 (n - 2);
else
return -1;
}
unsigned long long tempResult[131080]={0};
unsigned long long Fibonacci2(int n)
{
if (n == 0)
return 0;
else if (n == 1)
return 1;
else if (n > 1)
{
if(tempResult[n] != 0)
return tempResult[n];
else
{
tempResult[n] = Fibonacci2 (n - 1) + Fibonacci2 (n - 2);
return tempResult[n];
}
}
else
return -1;
}
unsigned long long Fibonacci3(int n)
{
unsigned long long * temp = new unsigned long long[n + 1];
temp[0] = 0;
if (n > 0)
temp[1] = 1;
for(int i = 2; i <= n; ++i)
{
temp[i] = temp[i - 1] + temp[i - 2];
}
unsigned long long result = temp[n];
delete[] temp;
return result;
}
#include<iomanip>
int main()
{
cout<<setw(12)<<"Fibonacci1"<<setw(12)<<"Fibonacci2"<<setw(12)
<<"Fibonacci3"<<endl;
for(int i=0;i<20;i++)
{
cout<<setw(12)<<Fibonacci1(i)<<setw(12)<<
Fibonacci2(i)<<setw(12)<<Fibonacci3(i)<<endl;
}
}
输出: