c语言斐波那契数列_神奇的数列——斐波那契数列
斐波那契數列之美
斐波那契是一位數學家,生于公元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(二進制)。這就是快速求二階矩陣的核心方法。
代碼實現:
完整代碼:
斐波那契數列的應用
總結
以上是生活随笔為你收集整理的c语言斐波那契数列_神奇的数列——斐波那契数列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux系统不能启动怎么办
- 下一篇: 台积电董事会批准向员工分发 607.02