斐波那契序列

斐波那契(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;

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;
	}
}
输出:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值