斐波那契数列各种语言的解法共13页word资料Word文档格式.docx

上传人:b****5 文档编号:19306188 上传时间:2023-01-05 格式:DOCX 页数:18 大小:24.90KB
下载 相关 举报
斐波那契数列各种语言的解法共13页word资料Word文档格式.docx_第1页
第1页 / 共18页
斐波那契数列各种语言的解法共13页word资料Word文档格式.docx_第2页
第2页 / 共18页
斐波那契数列各种语言的解法共13页word资料Word文档格式.docx_第3页
第3页 / 共18页
斐波那契数列各种语言的解法共13页word资料Word文档格式.docx_第4页
第4页 / 共18页
斐波那契数列各种语言的解法共13页word资料Word文档格式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

斐波那契数列各种语言的解法共13页word资料Word文档格式.docx

《斐波那契数列各种语言的解法共13页word资料Word文档格式.docx》由会员分享,可在线阅读,更多相关《斐波那契数列各种语言的解法共13页word资料Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。

斐波那契数列各种语言的解法共13页word资料Word文档格式.docx

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、

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1