斐波那契数列的计算规律:神奇的数列斐波那契数列
斐波那契数列的计算规律:神奇的数列斐波那契数列斐波那契数列(f(n),f(0)=0,f(1)=1,f(2)=1,f(3)=2……)的其他性质:斐波那契数列的第n项同时也代表了集合{1 2 ... n}中所有不包含相邻正整数的子集个数。从第二项开始,每个奇数项的平方都比前后两项之积多1,每个偶数项的平方都比前后两项之积少1。(注:奇数项和偶数项是指项数的奇偶,而并不是指数列的数字本身的奇偶,比如第四项3是奇数,但它是偶数项,第五项5是奇数,它是奇数项,如果认为数字3和5都是奇数项,那就误解题意,怎么都说不通)如果你看到有这样一个题目:某人把一个8*8的方格切成四块,拼成一个5*13的长方形,故作惊讶地问你:为什么64=65?其实就是利用了斐波那契数列的这个性质:5、8、13正是数列中相邻的三项,事实上前后两块的面积确实差1,只不过后面那个图中有一条细长的狭缝,一般人不容易注意到。
斐波那契数列之美斐波那契是一位数学家,生于公元1170年,籍贯大概是比萨,卒于1240年后。1202年,他撰写了《珠算原理》(Liber Abaci)一书。他是第一个研究了印度和阿拉伯数学理论的欧洲人。斐波那契数列因他解决兔子繁殖的应用题而引入,故又称为“兔子数列”。除此之外,他对欧洲数学的另一大贡献就是引进阿拉伯数字,从而取代了复杂的罗马计数法。
有这样一个数列:1、1、2、3、5、8、13、21、34……前两个元素为1,其他元素均为前两个元素和。在数学上以如下递归的方法定义:
这就是斐波那契数列的数学定义。
奇妙的属性随着数列项数的增加,前一项与后一项之比越来越逼近黄金分割的数值0.6180339887……
从第二项开始,每个奇数项的平方都比前后两项之积多1,每个偶数项的平方都比前后两项之积少1。(注:奇数项和偶数项是指项数的奇偶,而并不是指数列的数字本身的奇偶,比如第四项3是奇数,但它是偶数项,第五项5是奇数,它是奇数项,如果认为数字3和5都是奇数项,那就误解题意,怎么都说不通)
如果你看到有这样一个题目:
某人把一个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……)的其他性质:
f(0) f(1) f(2) … f(n)=f(n 2)-1
f(1) f(3) f(5) … f(2n-1)=f(2n)
f(2) f(4) f(6) … f(2n) =f(2n 1)-1
[f(0)]^2 [f(1)]^2 … [f(n)]^2=f(n)·f(n 1)
f(0)-f(1) f(2)-… (-1)^n·f(n)=(-1)^n·[f(n 1)-f(n)] 1
f(m n-1)=f(m-1)·f(n-1) f(m)·f(n)
利用这一点,可以用程序编出时间复杂度仅为O(log n)的程序。怎样实现呢?伪代码描述一下?
[f(n)]^2=(-1)^(n-1) f(n-1)·f(n 1)
f(2n-1)=[f(n)]^2-[f(n-2)]^2
3f(n)=f(n 2) f(n-2)
f(2n-2m-2)[f(2n) f(2n 2)]=f(2m 2) f(4n-2m) [ n〉m≥-1 且n≥1]
f(2n 1)=[f(n)]^2 [f(n 1)]^2
算法之矩阵计算斐波那契数列从第三项开始,每一项都是前两项之和。 F(n)=F(n−1) F(n−2) n⩾3 把斐波那契数列中 相邻的两项F(n)和F(n−1)写成一个2×1的矩阵。
求F(n)等于求二阶矩阵的n - 1次方,结果取矩阵第一行第一列的元素。
问题转换为二阶矩阵的n次幂。而计算二阶矩阵的N次幂运算,由于二阶矩阵乘法满足结合律,这样,可以快速计算二阶矩阵的n次幂运算。
假设A为一个二阶矩阵,则A的幂运算满足下面的条件:
A**6=A**3∗A**3
A**7=A**3∗A**3∗A**1=A**4*A**2*A**1
可以类似地把A看做是二进制中的2,2**7=2**4*2**2*2**1也就是说可以把矩阵的幂转换成二进制来表示。从而可以将n次幂拆解成长度为logn的二进制数来表示:7=111(二进制)。这就是快速求二阶矩阵的核心方法。
代码实现:
完整代码:
斐波那契数列的应用