斐波那契数列各种语言的解法共13页word资料Word文档格式.docx
《斐波那契数列各种语言的解法共13页word资料Word文档格式.docx》由会员分享,可在线阅读,更多相关《斐波那契数列各种语言的解法共13页word资料Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
1、1、2、3、5、8、13、21、……
这个数列从第三项开始,每一项都等于前两项之和。
它的通项公式为:
(见图)(又叫“比内公式”,是用无理数表示有理数的一个范例。
)
有趣的是:
这样一个完全是自然数的数列,通项公式居然是用无理数来表达的。
[编辑本段]【奇妙的属性】
随着数列项数的增加,前一项与后一项之比越来越逼近黄金分割的数值0.6180339887……
从第二项开始,每个奇数项的平方都比前后两项之积多1,每个偶数项的平方都比前后两项之积少1。
(注:
奇数项和偶数项是指项数的奇偶,而并不是指数列的数字本身的奇偶,比如第五项的平方比前后两项之积多1,第四项的平方比前后两项之积少1)
如果你看到有这样一个题目:
某人把一个8*8的方格切成四块,拼成一个5*13的长方形,故作惊讶地问你:
为什么64=65?
其实就是利用了斐波那契数列的这个性质:
5、8、13正是数列中相邻的三项,事实上前后两块的面积确实差1,只不过后面那个图中有一条细长的狭缝,一般人不容易注意到。
斐波那契数列的第n项同时也代表了集合{1,2,...,n}中所有不包含相邻正整数的子集个数。
斐波那契数列(f(n),f(0)=0,f
(1)=1,f
(2)=1,f(3)=2……)的其他性质:
1.f(0)+f
(1)+f
(2)+…+f(n)=f(n+2)-1
2.f
(1)+f(3)+f(5)+…+f(2n-1)=f(2n)
3.f
(2)+f(4)+f(6)+…+f(2n)=f(2n+1)-1
4.[f(0)]^2+[f
(1)]^2+…+[f(n)]^2=f(n)·
f(n+1)
5.f(0)-f
(1)+f
(2)-…+(-1)^n·
f(n)=(-1)^n·
[f(n+1)-f(n)]+1
6.f(m+n)=f(m-1)·
f(n-1)+f(m)·
f(n)
利用这一点,可以用程序编出时间复杂度仅为O(logn)的程序。
7.[f(n)]^2=(-1)^(n-1)+f(n-1)·
8.f(2n-1)=[f(n)]^2-[f(n-2)]^2
9.3f(n)=f(n+2)+f(n-2)
10.f(2n-2m-2)[f(2n)+f(2n+2)]=f(2m+2)+f(4n-2m)[n〉m≥-1,且n≥1]斐波那契数列
在杨辉三角中隐藏着斐波那契数列
1
11
121
1331
14641
……
过第一行的“1”向左下方做45度斜线,之后做直线的平行线,将每条直线所过的数加起来,即得一数列1、1、2、3、5、8、……
斐波那契数与植物花瓣
3………………………百合和蝴蝶花
5………………………蓝花耧斗菜、金凤花、飞燕草
8………………………翠雀花
13………………………金盏
21………………………紫宛
34、55、89……………雏菊
斐波那契数还可以在植物的叶、枝、茎等排列中发现。
例如,在树木的枝干上选一片叶子,记其为数0,然后依序点数叶子(假定没有折损),直到到达与那息叶子正对的位置,则其间的叶子数多半是斐波那契数。
叶子从一个位置到达下一个正对的位置称为一个循回。
叶子在一个循回中旋转的圈数也是斐波那契数。
在一个循回中叶子数与叶子旋转圈数的比称为叶序(源自希腊词,意即叶子的排列)比。
多数的叶序比呈现为斐波那契数的比。
斐波那契数列与黄金比
1/1=1,2/1=2,3/2=1.5,5/3=1.6…,8/5=1.6,…………89/55=1.61818…,…………233/144=1.618055…
[编辑本段]【影视链接】
斐波那契数列在欧美可谓是尽人皆知,于是在电影这种通俗艺术中也时常出现,比如在风靡一时的《达芬奇密码》里它就作为一个重要的符号和情节线索出现,在《魔法玩具城》里又是在店主招聘会计时随口问的问题。
可见此数列就像黄金分割一样流行。
可是虽说叫得上名,多数人也就背过前几个数,并没有深入理解研究。
[编辑本段]【相关的数学问题】
1.排列组合
有一段楼梯有10级台阶,规定每一步只能跨一级或两级,要登上第10级台阶有几种不同的走法?
这就是一个斐波那契数列:
登上第一级台阶有一种登法;
登上两级台阶,有两种登法;
登上三级台阶,有三种登法;
登上四级台阶,有五种登法……
1,2,3,5,8,13……所以,登上十级,有89种走法。
2.数列中相邻两项的前项比后项的极限
当n趋于无穷大时,F(n)/F(n+1)的极限是多少?
这个可由它的通项公式直接得到,极限是(-1+√5)/2,这个就是黄金分割的数值,也是代表大自然的和谐的一个数字。
3.求递推数列a
(1)=1,a(n+1)=1+1/a(n)的通项公式
由数学归纳法可以得到:
a(n)=F(n+1)/F(n),将斐波那契数列的通项式代入,化简就得结果。
[编辑本段]【斐波那契数列别名】
斐波那契数列又因数学家列昂纳多·
斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”。
一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。
如果所有兔都不死,那么一年以后可以繁殖多少对兔子?
我们不妨拿新出生的一对小兔子分析一下:
第一个月小兔子没有繁殖能力,所以还是一对;
两个月后,生下一对小兔民数共有两对;
三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对;
------
依次类推可以列出下表:
经过月数:
---1---2---3---4---5---6---7---8---9---10---11---12
兔子对数:
---1---1---2---3---5---8--13--21--34--55--89--144
表中数字1,1,2,3,5,8---构成了一个数列。
这个数列有关十分明显的特点,那是:
前面相邻两项之和,构成了后一项。
这个特点的证明:
每月的大兔子数为上月的兔子数,每月的小兔子数为上月的大兔子数,即上上月的兔子数,相加。
这个数列是意大利中世纪数学家斐波那契在<算盘全书>中提出的,这个级数的通项公式,除了具有a(n+2)=an+a(n+1)的性质外,还可以证明通项公式为:
an=(1/√5)*[(1+√5/2)^n-(1-√5/2)^n](n=1,2,3.....)
[编辑本段]斐波那契数列公式的推导
【斐波那契数列通项公式的推导】 斐波那契数列:
如果设F(n)为该数列的第n项(n∈N+)。
那么这句话可以写成如下形式:
F(0)=0,F
(1)=F
(2)=1,F(n)=F(n-1)+F(n-2)(n≥3)
显然这是一个线性递推数列。
通项公式的推导方法一:
利用特征方程
线性递推数列的特征方程为:
X^2=X+1
解得
X1=(1+√5)/2,,X2=(1-√5)/2
则F(n)=C1*X1^n+C2*X2^n
∵F
(1)=F
(2)=1
∴C1*X1+C2*X2
C1*X1^2+C2*X2^2
解得C1=1/√5,C2=-1/√5
∴F(n)=(1/√5)*{[(1+√5)/2]^n-[(1-√5)/2]^n}(√5表示根号5)
通项公式的推导方法二:
普通方法
设常数r,s
使得F(n)-r*F(n-1)=s*[F(n-1)-r*F(n-2)]
则r+s=1,-rs=1
n≥3时,有
F(n)-r*F(n-1)=s*[F(n-1)-r*F(n-2)]
F(n-1)-r*F(n-2)=s*[F(n-2)-r*F(n-3)]
F(n-2)-r*F(n-3)=s*[F(n-3)-r*F(n-4)]
F(3)-r*F
(2)=s*[F
(2)-r*F
(1)]
将以上n-2个式子相乘,得:
F(n)-r*F(n-1)=[s^(n-2)]*[F
(2)-r*F
(1)]
∵s=1-r,F
(1)=F
(2)=1
上式可化简得:
F(n)=s^(n-1)+r*F(n-1)
那么:
=s^(n-1)+r*s^(n-2)+r^2*F(n-2)
=s^(n-1)+r*s^(n-2)+r^2*s^(n-3)+r^3*F(n-3)
=s^(n-1)+r*s^(n-2)+r^2*s^(n-3)+……+r^(n-2)*s+r^(n-1)*F
(1)
=s^(n-1)+r*s^(n-2)+r^2*s^(n-3)+……+r^(n-2)*s+r^(n-1)
(这是一个以s^(n-1)为首项、以r^(n-1)为末项、r/s为公比的等比数列的各项的和)
=[s^(n-1)-r^(n-1)*r/s]/(1-r/s)
=(s^n-r^n)/(s-r)
r+s=1,-rs=1的一解为s=(1+√5)/2,r=(1-√5)/2
则F(n)=(1/√5)*{[(1+√5)/2]^n-[(1-√5)/2]^n}
迭代法
已知a1=1,a2=1,an=a(n-1)+a(n-2)(n>
=3),求数列{an}的通项公式
解:
设an-αa(n-1)=β(a(n-1)-αa(n-2))
得α+β=1
αβ=-1
构造方程x&
sup2;
-x-1=0,解得α=(1-√5)/2,β=(1+√5)/2或α=(1+√5)/2,β=(1-√5)/2
所以
an-(1-√5)/2*a(n-1)=(1+√5)/2*(a(n-1)-(1-√5)/2*a(n-2))=[(1+√5)/2]^(n-2)*(a2-(1-√5)/2*a1)`````````1
an-(1+√5)/2*a(n-1)=(1-√5)/2*(a(n-1)-(1+√5)/2*a(n-2))=[(1-√5)/2]^(n-2)*(a2-(1+√5)/2*a1)`````````2
由式1,式2,可得
an=[(1+√5)/2]^(n-2)*(a2-(1-√5)/2*a1)``````````````3
an=[(1-√5)/2]^(n-2)*(a2-(1+√5)/2*a1)``````````````4
将式3*(1+√5)/2-式4*(1-√5)/2,化简得an=(1/√5)*{[(1+√5)/2]^n-[(1-√5)/2]^n}
`````
[编辑本段]【C语言程序】
//利用循环输出前40项
#include<
stdio.h>
intmain()
{
longfib[41]={0,1};
inti;
for(i=2;
i<
41;
i++)fib[i]=fib[i-1]+fib[i-2];
for(i=1;
i++)printf("
F%d==%d\n"
i,fib[i]);
getch();
return0;
}
//利用递归实现指定项输出
第n项和。
(1<
n<
25)
#include<
voidmain()
longintf1,f2;
intn,i,c;
scanf("
%d"
&
n);
f1=1;
f2=1;
=n;
i++)
c=i+1;
printf("
%dItem=%ld%dItem=%ld"
i,f1,c,f2);
if(i%2==0)printf("
\n"
);
f1=f1+f2;
f2=f2+f1;
[编辑本段]【C#语言程序】
publicclassFibonacci
//NormRen
staticvoidMain(string[]args)
intx=0,y=1;
for(intj=1;
j<
10;
j++,y=x+y,x=y-x)
Console.Write(y+"
"
[编辑本段]【Java语言程序】
publicstaticvoidmain(String[]args)
intx=1,y=1;
System.out.println(x+"
for(inti=1;
=20;
System.out.println(y+"
y=x+y;
x=y-x;
[编辑本段]【JavaScript语言程序】
functionFibonacci(num){
if(num<
=2){
return1;
}else{
returnFibonacci(num-1)+Fibonacci(num-2)
[编辑本段]【Pascal语言程序】
递推:
var
fib:
array[1..40]oflongint;
i:
integer;
begin
fib[1]:
=1;
fib[2]:
fori:
=3to40do
fib[i]:
=fib[i-1]+fib[i-2];
=1to40do
write(fib[i],'
'
end.
递归:
functionfib(n:
integer):
longint;
if(n=1)thenexit(0);
if(n=2)thenexit
(1);
=fib(n-2)+fib(n-1);
end;
高精度:
(编写BY:
AzraelWZJ)
programfzu1060;
typearr=array[0..1001]ofinteger;
vara,b,c:
arr;
i,j,k,n:
integer;
procedureadd(vara,b,c:
arr);
fillchar(c,sizeof(c),0);
c[0]:
=b[0];
=1toc[0]do
c[i]:
=a[i]+b[i];
c[i+1]:
=c[i+1]+(c[i]div10);
=c[i]mod10;
ifc[c[0]+1]>
0then
inc(c[0]);
inc(c[c[0]+1],c[c[0]]div10);
c[c[0]]:
=c[c[0]]mod10;
a:
=b;
b:
=c;
assign(input,'
d:
\input.txt'
assign(output,'
\output.txt'
reset(input);
rewrite(output);
whilenoteofdo
readln(n);
fillchar(a,sizeof(a),0);
fillchar(b,sizeof(b),0);
a[0]:
=1;
a[1]:
b[0]:
b[1]:
ifn=1thenwrite
(1)
else
ifn=2thenwrite
(1)
fork:
=3tondo
add(a,b,c);
=c[0]downto1do
write(c[k]);
writeln;
close(input);
close(output);
以上程序为FZU1060的标程.
[编辑本段]【PL/SQL程序】
declareinumber:
=0;
jnumber:
xnumber:
whilex<
1000
loop
dbms_output.put_line(x);
x:
=i+j;
=j;
j:
=x;
endloop;
[编辑本段]【数列与矩阵】
对于斐波那契数列1、1、2、3、5、8、13、…….有如下定义
F(n)=f(n-1)+f(n-2)
F
(1)=1
F
(2)=1
对于以下矩阵乘法
F(n+1)=11*F(n)
F(n)10F(n-1)
它的运算就是
F(n+1)=F(n)+F(n-1)
F(n)=F(n)
可见该矩阵的乘法完全符合斐波那契数列的定义
设1为B,11为C
110
可以用迭代得到:
斐波那契数列的某一项F(n)=(BC^(n-2))1
这就是斐波那契数列的矩阵乘法定义。
另矩阵乘法的一个运算法则A&
not;
^n(n为偶数)=A^(n/2)*A^(n/2).
因此可以用递归的方法求得答案。
时间效率:
O(logn),比模拟法O(n)远远高效。
代码(PASCAL)
{变量matrix是二阶方阵,matrix是矩阵的英文}
programfibonacci;
type
matrix=array[1..2,1..2]ofqword;
c,cc:
matrix;
n:
functionmultiply(x,y:
matrix):
temp:
temp[1,1]:
=x[1,1]*y[1,1]+x[1,2]*y[2,1];
temp[1,2]:
=x[1,1]*y[1,2]+x[1,2]*y[2,2];
temp[2,1]:
=x[2,1]*y[1,1]+x[2,2]*y[2,1];
temp[2,2]:
=x[2,1]*y[1,2]+x[2,2]*y[2,2];
exit(temp);
functiongetcc(n:
t:
ifn=1thenexit(c);
=ndiv2;
=getcc(t);
=multiply(temp,temp);
ifodd(n)thenexit(multiply(temp,c))
elseexit(temp);
procedureinit;
c[1,1]:
c[1,2]:
c[2,1]:
c[2,2]:
ifn=1then
writeln
(1);
halt;
ifn=2then
cc:
=getcc(n-2);
procedurework;
writeln(cc[1,1]+cc[1,2]);
init;
work;
[编辑本段]【数列值的另一种求法】
F(n)=[((sqrt(5)+1)/2)^n]
其中[x]表示取距离x最近的整数。
[编辑本段]【数列的前若干项】
1、1
2、1
3、2
4、3
5、5
6、8
7、13
8、21
9、34
10、55
11、89
12、144
13、