斐波那契是一位数学家,生于公元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