斐波那契数

一、背景与定义

       有这样一个数列1,1,2,3,5,8,13,21,34,55,89,144,……这个数列前两个数均为1,从第3项开始,每一项都等于前两项之和。

        数列最早被提出是,公元前200年左右,印度数学家Gopala,他在研究箱子包装物件长度恰好为1和2时的方法数时首先描述了这个数列。

       也就是这个问题:

       有n个台阶,你每次只能跨一阶或两阶,上楼有几种方法?

       而最早研究这个数列的当然就是斐波那契(Leonardo Fibonacci)了,生于公元1170年,卒于1240年,籍贯大概是比萨)。

       1202年,他撰写了《珠算原理》(Liber Abaci)一书。他是第一个研究了印度和阿拉伯数学理论的欧洲人。他的父亲被比萨的一家商业团体聘任为外交领事,派驻地点相当于今日的阿尔及利亚地区,列昂纳多因此得以在一个阿拉伯老师的指导下研究数学。他还曾在埃及、叙利亚、希腊、西西里和普罗旺斯研究数学。

        他当时是为了描述如下情况的兔子生长数目:

        第一个月初有一对刚诞生的兔子,

        第二个月之后(第三个月初)它们可以生育,

        每月每对可生育的兔子会诞生下一对新兔子,

        兔子永不死去。

 

         这个数列出自他赫赫有名的大作《计算之书》,后来就被广泛的应用于各种场合了。

         斐波纳契数列以如下被以递归的方法定义: ;这个数列从第三项开始,每一项都等于前两项之和。

        递推公式:

 二、斐波那契数列及其特点

       斐波那契数列通项公式:斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、……

       菲波纳契数列既谓神奇数字,上述数字自有神奇之处,其特点包括:

       1、从第三项起,任何一个数字均是其前两个数字的和数,例如1+1=2;1+2=3;2+3=5;3+5=8;5+8=13;8+13=21;13+21=34等。

       2、任何两个相隔的数字彼此顺序相除或倒转相除,所得数字分别接近0.382及2.618。

               接近0.382比率,例如:8÷21=0.381;13÷34=0.382;21÷55=0.382等。

               接近2.618比率,例如:21÷8=2.625;34÷13=2.615;55÷21=2.619等。

        3、除首四个数字(1、1、2、3)外,两个相邻数字彼此相除,所得数字分别接近0.618(黄金分割比例)及1.618比率。

               接近0.618比率,例如:5÷8=0.625;8÷13=0.615;13÷21=0.619等。

               接近1.618比率,例如:8÷5=1.6;13÷8=1.625;21÷13=1.615等。

三、通项公式

       

四、性质

        1.性质1:前n项和:sn=a1+a2+a3+......+an=an+2-1

         证明:an=an+2-an+1

                   an-1=an+1-an

                   an-2=an-an-1

                     .

                     .

                     .

                     a1=a3-a2

                     累和:sn=a1+a2+a3+......+an=an+2-a2

                     因为a2=1

                     所以sn=a1+a2+a3+......+an=an+2-1

        2.性质2:奇数项和:a1+a3+a5+......+an-1=a2n

                        偶数项和:a2+a4+a6+......+a2n=a2n+1-1

           证明:①a1=a2

                         a3=a4-a2

                         a5=a6-a4

                          .

                         a2n-1=a2n-a2n-2

                         累和:a1+a3+a5+......+an-1=a2n

                      ②a2=a3-a1

                         a4=a5-a3

                          .

                         a2n=a2n+1-a2n-1

                         累和:a2+a4+a6+......+a2n=a2n+1-1

         3.性质3:平方性质:an2=anan+1-anan-1

                        平方和性质:a12+a22+......+an2=anan+1

             证明:①an+2=an+1+an

                           an+1=an+2-an

                           两边同时乘an+1:an+12=an+2an+1-an+1an

                           令n+1=n时:an2=an+1an-anan-1

                       ②由①可知:

                           a12=a2a1

                          a22=a3a2-a2a1

                          a32=a4a3-a3a2

                          .

                          .

                          an2=an+1an-anan-1

                         累和:a12+a22+......+an2=anan+1

         4.性质4:中项性质:anan+2-an+12=(-1)n+1

                                          3an=an-2+an+2

            证明: ①归纳

                          anan+2=an+12+(-1)n+1

                          a1a3-a22=1

                          a2a4-a32=-1

                          a3a5-a42=1

                          a4a6-a52=-1。。。。。。

                          猜测:anan+2-an+12=(-1)n+1

                        ②an-2=an-an-1

                            an+2=an+an+1

                           又因为an+1=an+an-1

                           所以an+2=2a1+an-1

                           所以an-2+an+2=3an

         5.性质5:模除周期性(余数列周期性):2、3、4则3、8、6

                        解释:(1)被2除的余数列周期为3:1,1,0,1,1,0......

                                   (2)被3除的余数列周期为8:1,1,2,0,2,2,1,0,1,1,2,0,2,2,1,0......

                                   (3)被4除的余数列周期为6:1,1,2,3,1,0,1,1,2,3,1,0,1,1,2,3,1,0......

         6.性质6:质数数量

                        每3个连续的数中有且只有一个被2整除;

                        每4个连续的数中有且只有一个被3整除;

                        每5个连续的数中有且只有一个被5整除;

                        每6个连续的数中有且只有一个被8整除;

                        每7个连续的数中有且只有一个被13整除;

五、经典实例

        1.代码实现

         

         2.矩阵快速幂实现

   斐波那契的边界条件是 F(0)=0 F(1)=1。当 n>1 时,每一项的和都等于前两项的和,因此有如下递推关系:F(n)=F(n-1)+F(n-2)

  (1)递归思想

递归的思想是把一个大型复杂问题层层转化为一个与原问题规模更小的问题,问题被拆解成子问题后,递归调用继续进行,直到子问题无需进一步递归就可以解决的地步为止。

  其时间复杂度为O(2^N),由于其时间复杂度太高,在实际应用中用武之地并没有想象的那么多,要是真写个这种程序,老板应该是不容下你了。

  (2)空间换时间

动态开辟空间将计算出的数据记录下来,避免重复计算,使用空间换时间。

时间复杂度O(n),空间复杂度O(n)

  这里使用动态开辟空间而不用数组,因为数组的大小有限制。

其缺点依然十分明显,其空间复杂度较高,开辟堆区内存,若管理不当,甚至可能造成内存泄漏。

  (3)动态规划

本方法是在方法二的基础上节省空间。利用滚动数组思想,将空间复杂度由O(n)优化为O(1)。时间复杂度依然为O(n)

  基本掌握这个方法就可以了。

  (4)通项公式(方法一)

    

       

    (5)矩阵快速幂(方法二)

  

 

   

       

      

        时间复杂度为O(logn),空间复杂度为O(1)

  总结:方法一和方法二尽量不要使用。

  参考来自百科、博客,仅限内部使用。

 

 

 

 

 

 

 

 

 

 

 

posted @ 2023-01-06 15:20  ddfy198811  阅读(1136)  评论(0)    收藏  举报