斐波那契數列執行個體講解以及C++實現

來源:互聯網
上載者:User

標籤:

斐波那契數列,又稱黃金分割數列,指的是這樣一個數列:0、1、1、2、3、5、8、13、21、……在數學上,費伯納西數列以如下被以遞迴的方法定義:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在現代物理、准晶體結構、化學等領域,費伯納西數列都有直接的應用,為此,美國數學會從1963起出版了以《費伯納西數列季刊》為名的一份數學雜誌,用於專門刊載這方面的研究成果。

斐波那契數列指的是這樣一個數列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368
特別指出:第0項是0,第1項是第一個1。

兔子繁殖問題斐波那契數列又因數學家列昂納多·斐波那契以兔子繁殖為例子而引入,故又稱為“兔子數列”。一般而言,兔子在出生兩個月後,就有繁殖能力,一對兔子每個月能生出一對小兔子來。如果所有兔子都不死,那麼一年以後可以繁殖多少對兔子?我們不妨拿新出生的一對小兔子分析一下:第一個月小兔子沒有繁殖能力,所以還是一對兩個月後,生下一對小兔對數共有兩對三個月以後,老兔子又生下一對,因為小兔子還沒有繁殖能力,所以一共是三對------依次類推可以列出下表:
經過月數 0 1 2 3 4 5 6 7 8 9 10 11 12
幼仔對數 1 0 1 1 2 3 5 8 13 21 34 55 89
成兔對數 0 1 1 2 3 5 8 13 21 34 55 89 144
總體對數 1 1 2 3 5 8 13 21 34 55 89 144 233
幼仔對數=前月成兔對數成兔對數=前月成兔對數+前月幼仔對數總體對數=本月成兔對數+本月幼仔對數可以看出幼仔對數、成兔對數、總體對數都構成了一個數列。這個數列有關十分明顯的特點,那是:前面相鄰兩項之和,構成了後一項。設月數為n;則有F(0)=1;F(1)=1;F(n)=F(n-1)+F(n-2);黃金分割隨著數列項數的增加,前一項與後一項之比越來越逼近黃金分割的數值0.6180339887..…
看4楊輝三角將楊輝三角靠左對齊,成排列,將同一斜行的數加起來,即得一數列1、1、2、3、5、8、……公式表示如下:f⑴=C(0,0)=1。f⑵=C(1,0)=1。f⑶=C(2,0)+C(1,1)=1+1=2。f⑷=C(3,0)+C(2,1)=1+2=3。f⑸=C(4,0)+C(3,1)+C(2,2)=1+3+1=5。f⑹=C(5,0)+C(4,1)+C(3,2)=1+4+3=8。F⑺=C(6,0)+C(5,1)+C(4,2)+C(3,3)=1+5+6+1=13。……F(n)=C(n-1,0)+C(n-2,1)+…+C(n-1-m,m) (m<=n-1-m)質數品質斐波那契數列的整除性與素數產生性每3個連續的數中有且只有一個被2整除,每4個連續的數中有且只有一個被3整除,每5個連續的數中有且只有一個被5整除,每6個連續的數中有且只有一個被8整除,每7個連續的數中有且只有一個被13整除,每8個連續的數中有且只有一個被21整除,每9個連續的數中有且只有一個被34整除,.......我們看到第5、7、11、13、17、23位分別是素數:5,13,89,233,1597,28657(第19位不是)
數字謎題三角形的三邊關系定理和斐波那契數列的一個聯絡:現有長為144cm的鐵絲,要截成n小段(n>2),每段的長度不小於1cm,如果其中任意三小段都不能拼成三角形,則n的最大值為多少?分析:由於形成三角形的充要條件是任何兩邊之和大於第三邊,因此不構成三角形的條件就是任意兩邊之和不超過最大邊。截成的鐵絲最小為1,因此可以放2個1,第三條線段就是2(為了使得n最大,因此要使剩下來的鐵絲儘可能長,因此每一條線段總是前面的相鄰2段之和),依次為:1、1、2、3、5、8、13、21、34、55,以上各數之和為143,與144相差1,因此可以取最後一段為56,這時n達到最大為10。我們看到,“每段的長度不小於1”這個條件起了控制全域的作用,正是這個最小數1產生了斐波那契數列,如果把1換成其他數,遞推關係保留了,但這個數列消失了。這裡,三角形的三邊關係定理和斐波那契數列發生了一個聯絡。在這個問題中,144>143,這個143是斐波那契數列的前n項和, 我們是把144超出143的部分加到最後的一個數上去,如果加到其他數上,就有3條線段可以構成三角形了。影視作品中的斐波那契數列斐波那契數列在歐美可謂是盡人皆知,於是在電影這種通俗藝術中也時常出現,比如在風靡一時的《達芬奇密碼》裡它就作為一個重要的符號和情節線索出現,在《魔法玩具城》裡又是在店主招聘會計時隨口問的問題。可見此數列就像黃金分割一樣流行。可是雖說叫得上名,多數人也就背過前幾個數,並沒有深入理解研究。在電視劇中也出現斐波那契數列,比如:日劇《考試之神》第五回,義嗣做全國類比考試題中的最後一道數學題~在FOX熱播美劇《Fringe》中更是無數次引用,甚至作為全劇宣傳海報的設計項目之一。排列組合一、一枚均勻的硬幣擲10次,問不連續出現正面的可能情形有多少種?答案是144種。

利用標準斐波那契數列(0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144),答案為F(10+2)。一枚均勻的硬幣擲n次,不連續出現正面的可能情形有F(n+2)種。

二、有一段樓梯有10級台階,規定每一步只能跨一級或兩級,要登上第10級台階有幾種不同的走法?

這就是一個斐波那契數列:登上第一級台階有一種登法;登上兩級台階,有兩種登法;登上三級台階,有三種登法;登上四級台階,有五種登法……1,2,3,5,8,13……所以,登上十級,有89種走法。這不是一個標準的斐波那契數列,初始化F(0)=0,F(1)=1,F(2)=2.同leetcode上有一道題:You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

可用遞迴實現如下:

int stairs_climbing1(int n){if (n==0||n==1||n==2) return n;return stairs_climbing1(n-1)+stairs_climbing1(n-2);}
但這種方法,每計算一次F(n)之前從F(0)到F(n-1)以及F(n-2)的過程都要重複執行一次,計算時間複雜度大,無法在規定時間內完成工作。改進演算法,記錄F(0)~F(n)的值,代碼如下:

int stairs_climbing(int n){if (n==0||n==1||n==2) return n;vector<int >mem(n+1);mem[0]=0;mem[1]=1;mem[2]=2;int res;for (int i=3;i<n+1;i++){mem[i]=mem[i-1]+mem[i-2];}return mem[n];}

擴充由上例可以看出,當初始值不一樣時,F(n)=F(n-1)+F(n-2)就可能會有不一樣的結果。

斐波那契—盧卡斯數列盧卡斯數列1、3、4、7、11、18…,也具有斐波那契數列同樣的性質。(我們可稱之為斐波那契—盧卡斯遞推:從第三項開始,每一項都等於前兩項之和f(n) = f(n-1)+ f(n-2)。佩爾數列1,2,5,12,29,…,也有|2*2-1*5|=|5*5-2*12|=…=1(該類數列的這種特徵值稱為勾股特徵)。佩爾數列Pn的遞推規則:P1=1,P2=2,Pn=P(n-2)+2P(n-1). 廣義斐波那契數列類推到所有根據前兩項匯出第三項的通用規則:f(n) = f(n-1) * p + f(n-2) * q,稱為廣義斐波那契數列。當p=1,q=1時,我們得到斐波那契—盧卡斯數列。當p=1,q=2時,我們得到佩爾—勾股弦數(跟邊長為整數的直角三角形有關的數列集合)。當p=2,q=-1時,我們得到等差數列。其中f1=1,f2=2時,我們得到自然數列1,2,3,4…。自然數列的特徵就是每個數的平方與前後兩數之積的差為1(等差數列的這種差值稱為自然特徵)。具有類似黃金特徵、勾股特徵、自然特徵的廣義——斐波那契數列p=±1。當f1=1,f2=2,p=2,q=0時,我們得到等比數列1,2,4,8,16……本文參考:
http://baike.baidu.com/link?url=uYAPJgZmzQDU8wuN0H4QjB1nBUqRPtNeNz5yAzDGpcUWhBqT6KNGvvC-9iroF6TxScwngt_jM4-6XGQDppiKEK


我們不妨拿新出生的一對小兔子分析一下:第一個月小兔子沒有繁殖能力,所以還是一對兩個月後,生下一對小兔對數共有兩對三個月以後,老兔子又生下一對,因為小兔子還沒有繁殖能力,所以一共是三對------依次類推可以列出下表:
經過月數 0 1 2 3 4 5 6 7 8 9 10 11 12
幼仔對數 1 0 1 1 2 3 5 8 13 21 34 55 89
成兔對數 0 1 1 2 3 5 8 13 21 34 55 89 144
總體對數 1 1 2 3 5 8 13 21 34 55 89 144 233
幼仔對數=前月成兔對數成兔對數=前月成兔對數+前月幼仔對數總體對數=本月成兔對數+本月幼仔對數可以看出幼仔對數、成兔對數、總體對數都構成了一個數列。這個數列有關十分明顯的特點,那是:前面相鄰兩項之和,構成了後一項。設月數為n;則有F(0)=1;F(1)=1;F(n)=F(n-1)+F(n-2);黃金分割隨著數列項數的增加,前一項與後一項之比越來越逼近黃金分割的數值0.6180339887..…
看4楊輝三角

斐波那契數列執行個體講解以及C++實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.