费波那西数列(兔子问题)Fibonacci
- 格式:doc
- 大小:31.50 KB
- 文档页数:2
源起
根据高德纳(Donald Ervin Knuth)的《计算机程序设计艺术》(The Art of Computer Programming),1150年印度数学家Gopala和金月在研究箱子包装物件长阔刚好为1 和 2 的可行方法数目时,首先描述这个数列。
在西方,最先研究这个数列的人是比萨的列奥那多(又名费波那西),他描述兔子生长的数目时用上了这数列。
第一个月有一对刚诞生的兔子
第二个月之后它们可以生育
每月每对可生育的兔子会诞生下一对新兔子
兔子永不死去
假设在n 月有新生及可生育的兔子总共 a 对,n+1 月就总共有 b 对。
在n+2 月必定总共有a+b 对:因为在n+2 月的时候,所有在n 月就已存在的 a 对兔子皆已可以生育并诞下 a 对后代;同时在前一月(n+1月)之 b 对兔子中,在当月属于新诞生的兔子尚不能生育。
数学求解:
为求得费波那西数列的一般表达式,可以借助线性代数的方法。
高中的初等数学知识也能求出。
已知
∙a1 = 1
∙a2 = 1
∙a n = a n− 1 + a n− 2
首先构建等比数列
设a n + αa n− 1 = β(a n− 1 + αa n− 2)
化简得
a n = (β−α)a n− 1 + αβa n− 2
比较系数可得:
不妨设β > 0,α > 0
解得:
所以有a n + αa n− 1 = β(a n− 1 + αa n− 2),即为等比数列。
求出数列{a n + αa n− 1}
由以上可得:变形得:。
令
求数列{b n}进而得到{a n}
设,解得。
故数列为等比数列
即。
而,故有
又有和
可得
得出a n表达式
可以参考网站:
/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5% A5%91%E6%95%B0%E5%88%97
程序实现解法:
#include <iostream>
using namespace std;
int fact(int n)
{
if(n==0)
return(0);
else
{if(n==1)
return(1);
else
return(fact(n-1)+fact(n-2));
}
}
int main()
{ int i;
cout<<"请输入月份"<<endl;
cin>>i;
cout<<fact(i)<<endl;
}。