斐波那契數列為什麼那麼重要,所有關於數學的書幾乎都會提到?

2021-01-19 遠方的家


本文轉自知乎,作者為王希(數學話題下的優秀回答者)


一句話先回答問題:因為斐波那契數列在數學和生活以及自然界中都非常有用。

下面我就盡我所能,講述一下斐波那契數列。

一、起源和定義

斐波那契數列最早被提出是印度數學家Gopala,他在研究箱子包裝物件長度恰好為1和2時的方法數時首先描述了這個數列。也就是這個問題:

有n個臺階,你每次只能跨一階或兩階,上樓有幾種方法?


而最早研究這個數列的當然就是斐波那契(Leonardo Fibonacci)了,他當時是為了描述如下情況的兔子生長數目:

第一個月初有一對剛誕生的兔子

第二個月之後(第三個月初)它們可以生育

每月每對可生育的兔子會誕生下一對新兔子

兔子永不死去



這個數列出自他赫赫有名的大作《計算之書》(沒有維基詞條,坑),後來就被廣泛的應用於各種場合了。這個數列是這麼定義的:


The On-Line Encyclopedia of Integer Sequences® (OEIS®)序號為A000045 - OEIS

(注意,並非滿足第三條的都是斐波那契數列,盧卡斯數列(A000032 - OEIS)也滿足這一特點,但初始項定義不同)

二、求解方法

講完了定義,再來說一說如何求對應的項。斐波那契數列是編程書中講遞歸必提的,因為它是按照遞歸定義的。所以我們就從遞歸開始講起。

1.遞歸求解

int Fib(int n)
{
return n < 2 ? 1 : (Fib(n-1) + Fib(n-2));
}


這是編程最方便的解法,當然,也是效率最低的解法,原因是會出現大量的重複計算。為了避免這種情況,可以採用遞推的方式。

2.遞推求解

int Fib[1000];
Fib[0] = 0;Fib[1] = 1;
for(int i = 2;i < 1000;i++) Fib[i] = Fib[i-1] + Fib[i-2];


遞推的方法可以在O(n)的時間內求出Fib(n)的值。但是這實際還是不夠好,因為當n很大時這個算法還是無能為力的。接下來就要來講一個有意思的東西:矩陣。

3.矩陣遞推關係

學過代數的人可以看出,下面這個式子是成立的:

不停地利用這個式子迭代右邊的列向量,會得到下面的式子:

這樣,問題就轉化為如何計算這個矩陣的n次方了,可以採用快速冪的方法。快速冪_百度百科是利用結合律快速計算冪次的方法。比如我要計算,我們知道,而可以通過來計算,而可以通過計算,以此類推。通過這種方法,可以在O(lbn)的時間裡計算出一個數的n次冪。快速冪的代碼如下:

int Qpow(int a,int n)
{
int ans = 1;
while(n)
{
if(n&1) ans *= a;
a *= a;
n >>= 1;
}
return ans;
}

將上述代碼中的整型變量a變成矩陣,數的乘法變成矩陣乘法,就是矩陣快速冪了。比如用矩陣快速冪計算斐波那契數列:

#include <cstdio>#include <iostream>
using namespace std;

const int MOD = 10000;

struct matrix//定義矩陣結構體
{
int m[2][2];
}ans, base;

matrix multi(matrix a, matrix b)//定義矩陣乘法
{
matrix tmp;
for(int i = 0; i < 2; ++i)
{
for(int j = 0; j < 2; ++j)
{
tmp.m[i][j] = 0;
for(int k = 0; k < 2; ++k)
tmp.m[i][j] = (tmp.m[i][j] + a.m[i][k] * b.m[k][j]) % MOD;
}
}
return tmp;
}
int fast_mod(int n) // 求矩陣 base 的 n 次冪
{
base.m[0][0] = base.m[0][1] = base.m[1][0] = 1;
base.m[1][1] = 0;
ans.m[0][0] = ans.m[1][1] = 1; // ans 初始化為單位矩陣
ans.m[0][1] = ans.m[1][0] = 0;
while(n)
{
if(n & 1) //實現 ans *= t; 其中要先把 ans賦值給 tmp,然後用 ans = tmp * t
ans = multi(ans, base);

base = multi(base, base);
n >>= 1;
}
return ans.m[0][1];
}

int main()
{
int n;
while(scanf("%d", &n) && n != -1)
{
printf("%d\n", fast_mod(n));
}
return 0;
}


4.通項公式

無論如何,對於一個數列,我們都是希望可以建立與n的關係,也就是通項公式,而用不同方法去求解通項公式也是很有意思的。

(1)構造等比數列

,
化簡得,
比較係數得
解得
由於
故有,設.則有
,設,
解得,即{}是等比數列。這樣就有

到了現在,把上述解出的結果全部帶入上式,稍作變形,我們就可以寫出斐波那契數列的通項公式了





這個方法還是比較麻煩的,但是非常基礎。事實上還有其他更簡單的方法。

(2)線性代數解法
這個解法首先用到


公式,如果可以找到矩陣使得為對角陣,我們就可以求出通項。下面需要一些高等代數知識,沒學過的可直接跳過。
首先令,解得兩個特徵根

兩個特徵向量為





解出,中間矩陣的n次方可以直接求出來:



然後可以輕易得到通項公式,上邊已經給出,這裡不再贅述。

(3)特徵方程解法

通過方法(2),我們可以推導出一般的線性遞推數列的通項求解方法,也就是特徵方程法。我們可以發現,對於這種數列,通項總是可以表示為的形式,因此可以直接利用已知項求解。具體做法如下:

a.由遞推數列構造特徵方程,解出兩個特徵值

b.帶入,列出如下方程:




解得這樣直接寫出通項公式,是比較簡單的做法。

(4)母函數法(此方法涉及組合數學知識)

設斐波那契數列的母函數為,即




解得

再由冪級數展開公式……

合併同類項並與的係數比較即可。



到這裡,求解斐波那契數列通項的方法就說的差不多了。無論是計算機求解還是數學推導,都體現出了非常多的技巧。而斐波那契數列的許多特性,就更加有意思了。

三、斐波那契數列的數學性質

1.與黃金比的關係

由通項公式,求相鄰兩項的商的極限,結果是黃金比,所以斐波那契數列又稱為黃金比數列。斐波那契數列和黃金比還和一個有趣的數學概念——連分數有關:

2.一些簡單的規律

(1)任意連續四個斐波那契數,可以構造出一個畢達哥拉斯三元組。如取1,1,2,3.
中間兩數相乘再乘2 ==》 4
外層2數乘積==》3
中間兩數平方和==》5
得到3,4,5.
下一組是5,12,13,,有興趣的讀者可以再試著推一推,證明也是容易的。

(2)整除性

每3個連續的斐波那契數有且只有一個被2整除,


每4個連續的斐波那契數有且只有一個被3整除,


每5個連續的斐波那契數有且只有一個被5整除,


每6個連續的斐波那契數有且只有一個被8整除,


每7個連續的斐波那契數有且只有一個被13整除,

…………

每n個連續的斐波那契數有且只有一個被整除.


(3)一些恆等式




3.楊輝三角中的斐波那契數列


如圖所示,每條斜線上的數的和就構成斐波那契數列。



即有



4.相關數列:盧卡斯(Lucas)數列


盧卡斯數列的定義除了第0項為2之外,與斐波那契數列完全一致。即


其通項公式為:


盧卡斯數列和斐波那契數列有這些關係:








5.組合數學


(1)一些恆等式



(2)同餘特性




當p為大於5的素數時,有:




其中


斐波那契數列還有許許多多的性質,我就不再一一介紹了。跑題了這麼久,終於開始要真正回答問題了:斐波那契數列有什麼用?


四、斐波那契數列的應用


1.算法

a.斐波那契堆


斐波那契堆(Fibonacci heap)是計算機科學中最小堆有序樹的集合。它和二項式堆有類似的性質,可用於實現合併優先隊列。特點是不涉及刪除元素的操作有O(1)的平攤時間,用途包括稠密圖每次Decrease-key只要O(1)的平攤時間,和二項堆的O(lgn)相比是巨大的改進。


斐波那契堆由一組最小堆構成,這些最小堆是有根的無序樹。可以進行插入、查找、合併和刪除等操作

1)插入:創建一個僅包含一個節點的新的斐波納契堆,然後執行堆合併

2)查找:由於用一個指針指向了具有最小值的根節點,因此查找最小的節點是平凡的操作。

3)合併:簡單合併兩個斐波納契堆的根表。即把兩個斐波納契堆的所有樹的根首尾銜接並置。

4)刪除(釋放)最小節點

分為三步:

查找最小的根節點並刪除它,其所有的子節點都加入堆的根表,即它的子樹都成為堆所包含的樹;

需要查找並維護堆的最小根節點,但這耗時較大。為此,同時完成堆的維護:對堆當前包含的樹的度數從低到高,迭代執行具有相同度數的樹的合併並實現最小樹化調整,使得堆包含的樹具有不同的度數。這一步使用一個數組,數組下標為根節點的度數,數組的值為指向該根節點指針。如果發現具有相同度數的其他根節點則合併兩棵樹並維護該數組的狀態。

對當前堆的所有根節點查找最小的根節點。

5)降低一個點的鍵值:對一個節點的鍵值降低後,自鍵值降低的節點開始自下而上的迭代執行下述操作,直至到根節點或一個未被標記(marked)節點為止:

如果當前節點鍵值小於其父節點的鍵值,則把該節點及其子樹摘下來作為堆的新樹的根節點;其原父節點如果是被標記(marked)節點,則也被摘下來作為堆的新樹的根節點;如果其原父節點不是被標記(marked)節點且不是根節點,則其原父節點被加標記。

如果堆的新樹的根節點被標記(marked),則去除該標記。

6)刪除節點:把被刪除節點的鍵值調整為負無窮小,然後執行「降低一個節點的鍵值」算法,然後再執行「刪除最小節點」算法。

斐波那契堆


b.歐幾裡得算法的時間複雜度

歐幾裡得算法是求解兩個正整數最大公約數的算法,又稱輾轉相除法。代碼如下:

int gcd(int a,int b)
{
return b ? gcd(b,a%b) : a;
}


在最壞的情況下,我們可以證明,若a較小,需要計算的次數為n,則.雖然說一般分析的時候會當成對數階,但數論最常用的歐幾裡得算法竟然與斐波那契數列有關,也確實是很讓人吃驚呢。

2.物理學:氫原子能級問題

假定我們現在有一些氫氣原子,一個電子最初所處的位置是最低的能級(Ground lever of energy),屬於穩定狀態。它能獲得一個能量子或二個能量子(Quanta of energy)而使它上升到第一能級或者第二能級。但是在第一級的電子如失掉一個能量子就會下降到最低能級,它如獲得一個能量子就會上升到第二級來。


現在研究氣體吸收和放出能量的情形,假定最初電子是處在穩定狀態即零能級,然後讓它吸收能量,這電子可以跳到第1能級或第2能級。然後再讓這氣體放射能量,這時電子在1級能級的就要下降到0能級,而在第2能級的可能下降到0能級或者第1能級的位置去。


電子所處的狀態可能的情形是:1、2、3、5、8、13、21…種。這是斐波那契數列的一部份。


3.自然界:植物的生長

科學家發現,一些植物的花瓣、萼片、果實的數目以及排列的方式上,都有一個神奇的規律,它們都非常符合著名的斐波那契數列。例如:薊,它們的頭部幾乎呈球狀。在下圖中,你可以看到兩條不同方向的螺旋。我們可以數一下,順時針旋轉的(和左邊那條旋轉方向相同)螺旋一共有13條,而逆時針旋轉的則有21條。此外還有菊花、向日葵、松果、菠蘿等都是按這種方式生長的。




還有菠蘿、松子等,也都符合這個特點,一般會出現34,55,89和144這幾個數字。







最後上一張「斐波那契樹」的圖片:

是的,這玩意就長這樣,這種植物是存在的。

4.波浪理論與股市

這個答主不懂,大家可自行閱讀文章波浪理論斐波那契數列與黃金分割率。
不過波浪的形狀確實符合下邊要說的斐波那契螺旋:



5.斐波那契螺旋

斐波那契螺旋又稱黃金螺旋,在自然界中廣泛存在。如圖是一個邊長為斐波那契數列的正方形組成的矩形。


(加一句:看著這個圖,是不是能發現

是顯而易見的?)

這樣連起來就是斐波那契螺旋了



貝殼螺旋輪廓線








向日葵的生長


神奇的花



6.建築學





7.據說一個小男孩參考斐波那契數列發明了太陽能電池樹:

一名13歲的男孩根據斐波那契數列發明了太陽能電池樹,其產生的電力比太陽能光伏電池陣列多20-50%。斐波那契數列類似從0和1開始,之後的數是之前兩數的和,如0,1,1,2,3,5,8,13,21...Aidan Dwye在觀察樹枝分叉時發現它的分布模式類似斐波那契數列,這是大自然演化的一種結果,可能有助於樹葉進行光合作用。
因此,Dwye猜想為什麼不按照斐波那契數列排列太陽能電池?他設計了太陽能電池樹,發現它的輸出電力提高了20%,每天接受光照的時間延長了2.5小時。


8.斐波那契螺旋形的搖椅

媽媽搖椅是設計師Patrick Messier為自己的妻子兼合作夥伴Sophie Fournier設計的,當時他們剛有了第一個寶寶。

當Sophie宣布自己懷孕時,她說想要一把搖椅,但發現沒有一把搖椅能滿足美觀舒適的標準,於是Patrick決定自己做一把。

於是就有了這把媽媽搖椅。像是一個飄在空中的絲帶,由一片纖維玻璃做成,曲線服從斐波那契數列分布,經過特殊的高光聚氨酯處理。



五、數學上的擴展

(1)廣義斐波那契數列
定義:,數列滿足:

其通項為:

時即為斐波那契數列。

(2)反斐波那契數列

定義:
反斐波那契數列相鄰項比值的極限為

(3)巴都萬數列(A000931 - OEIS)
斐波那契數列可以刻畫矩形,而巴都萬數列則刻畫的是三角形。其定義如下:


(4)未解之謎:角谷猜想

對一個正整數,若為奇數則乘3加1,若為偶數則除以2,通過有限次這樣的操作,能否使得該數變成1?
這個猜想和斐波那契數列又很大關係,具體的可以看角谷猜想的斐波那契數列現象。


六、總結

斐波那契數列是各個學科中都出現的小滑頭,它許多漂亮的性質讓我們著迷。上文我所描述的這些只是它的冰山一角,權當拋磚引玉。大家讀完了我的答案,還可以再結合自己的專業去看一些相關的資料,更好的去了解這個有趣的數列。

七、參考文獻

[1]hytc.cn/xsjl/szh/lec5.p
[2]斐波那契數列_一米陽光
[3]斐波那契數列的規律性
[4]13歲男孩根據斐波那契數列發明太陽能電池樹_cnBeta 人物_cnBeta.COM
[5]服從斐波那契數列分布的媽媽搖椅
[6]從斐波那契數列到黃金分割
[7]斐波那契《計算之書》的研究.pdf 全文 文檔投稿網
[8]斐波那契數列
['9]費氏數列
[10]巴都萬數列
[11]zh.wikipedia.org/wiki/%
[12]角谷猜想的斐波那契數列現象
[13]The On-Line Encyclopedia of Integer Sequences® (OEIS®)
[14]波浪理論斐波那契數列與黃金分割率


【圖文來源】知乎

本文圖文來源於網絡,版權屬於原作者或網站,內容為作者觀點,並不代表本公眾號贊同其觀點及對其真實性負責。如有版權等問題,請與管理員郵箱聯繫,將立刻進行相應處理。

【遠方的家】集錦來自中國科學院汪壽陽研究員及其學生們的日常隨筆,分享各類熱點新聞、趣聞、消息。

微信號:homeofcas

投稿、意見,請直接回復或發信至:amssmadis@163.com


相關焦點

  • 最美的數列-斐波那契數列
    ——華羅庚每天十分鐘,數學很輕鬆!歡迎來到暖爸的數學碎碎念。大家好,我是愛數學的暖爸。今天跟大家一起分享一下斐波那契數列。斐波那契數列簡介其寫於1202年的著作《計算之書》中包涵了許多希臘、埃及、阿拉伯、印度、甚至是中國數學相關內容。斐波那契數列, 就是由這位義大利著名數學家萊昂納多·斐波那契在《計算之書》中以兔子繁殖為例子而提出的數列,故又稱為「兔子數列」。斐波那契數列:1、1、2、3、5、8、13、21、34、56……這個數列的特點是從第3項開始,每一項都是前兩項的和。
  • 斐波那契數列有多神奇?
    在所有的數列中,斐波那契數列無疑是最著名的一個:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377,……由來1202 年,生於義大利比薩的數學家 萊昂納多·斐波那契 完成了他的傳世名著《算盤書》,書中對一個有趣的 「兔子繁殖問題」 進行了研究,斐波那契數列便由此而來。
  • 生命曲線與神聖的斐波那契數列
    同樣讓他感到驚訝的是,最讓世人津津樂道是以他命名的這個斐波那契數列:0,1,1,2,3,5,8,13……,而並非本人更偉大的數學成就——將阿拉伯數字和乘數的位值表示法系統引入了歐洲。斐波那契為這些商人編寫了《計算之書》,其中就涉及到大量的實際問題,並舉例說明,與笨拙的羅馬數字相比,這套新的數字系統可以多麼簡單、高效地進行商業和數學計算。透過斐波那契的這本書將十進位數字影響傳播開來是他最偉大的數學成就。然而,本人卻是因為《計算之書》中列舉的斐波那契數列被世人所熟知的。
  • 斐波那契數列的兩個令人著迷的特性 - 電子通信和數學
    斐波那契數列是一個眾所周知的且經過研究的數字序列,經常在學校和休閒數學中使用,因為它很容易被那些受過有限的專業數學教育的人理解。序列的定義如下:第一項是零,第二項是一,任何其他項都是序列前兩項的和。這個序列的正式寫法如下當n> 1時。
  • 奇妙的斐波那契數列
    義大利的數學家列昂那多·斐波那契在1202年研究兔子產崽問題時發現了此數列。斐波那契在《計算之書》中提出了一個有趣的兔子問題:假設一對初生兔子要一個月才到成熟期,而一對成熟兔子每月會生一對兔子,那麼,由一對小兔子開始,12個月後會有多少對兔子呢?兔子繁殖的過程可以通過一棵「家族樹」來表示,如圖所示。
  • 交易玄學:斐波那契數列
    斐波那契數列。  斐波那契數列是什麼呢?  1202年,那時印刷術還沒有出現,斐波那契的書《算盤書》在義大利出版,受到當時羅馬君主的支持,而得以幸運地傳播開來。《算盤書》將阿拉伯世界的阿拉伯數字引進了當時的西方,其中一篇短文最為著名。
  • 上帝的指紋「斐波那契數列」,所引出的是這樣的「數學思想方法」
    縱觀以往高考考過的一些「特殊數列」中,常常會遇到神秘的「斐波那契數列」的身影,如果我們平時的數學視野不夠開闊的話,看到試卷上一連串這樣的數字:0、1、1、2、3、5、8、13、21、34……時,你會感到很陌生。然而對於那些平時常常讀課外數學科普讀物的學生來說,一眼就會看出這就是傳說中的「斐波那契數列」。那麼,究竟什麼是「斐波那契數列」呢?它有什麼樣的性質和作用呢?
  • 斐波那契數列——隱藏在自然界的數學美
    是大自然的天作之合成全了數學之美?還是數學揭示了自然規律而美不勝收?今天的故事要從西元1202年說起一位叫列昂納多·斐波那契的義大利數學家他發現了一個無聊有趣問題:假設一對初生兔子一個月到成熟期一對成熟兔子每月生一對兔子並且一年內沒有發生死亡那麼,由一對初生兔子開始一年以後可以繁殖多少對兔子?
  • 最迷人的數學公式——斐波那契數列公式(推導)
    斐波納契數列是數學中最迷人的東西之一。它們在幾乎所有數學家的心中都佔有特殊的地位。縱觀歷史,人們圍繞這些數列做了很多研究,結果發現了很多有趣的事實。讓我們看看他們是什麼樣子這個數列中的任何數都是前兩個數的和,這個模式在數學上可以寫成其中n是一個大於1的正整數,F(n)是第n個斐波納契數F(0)= 0和F(1)= 1。
  • 小學生也可以寫出的,複雜數列-斐波那契數列
    有一個數列與黃金分割比就有著不可名狀的關係,而且它的特性非常的多,關鍵這個數列還非常簡單,小學生都可以寫出來。今天我們就來著重講一下這個數列,斐波那契數列的4個特性。1.數列前兩項之和等於第三項如果設F(n)為該數列的第n項(n∈N*),那麼這句話可以寫成如下形式::F(n)=F(n-1)+F(n-2)以上就是斐波那契數列的官方定義。其實只要把數列擺出來,我們就可以很明確的看到特性了。1,1,2,3,5,8,13,21,34...
  • 求職乾貨:再也不怕面試官問斐波那契數列了! - CSDN
    作者 | 守望責編 | 胡巍巍前言假如面試官讓你編寫求斐波那契數列的代碼時,是不是心中暗喜?不就是遞歸麼,早就會了。如果真這麼想,那就危險了。遞歸解法遞歸,在數學與計算機科學中,是指在函數的定義中使用函數自身的方法。
  • 兔子繁殖問題帶來的智商碾壓,斐波那契數列問題趣談,值得挑戰
    斐波那契(1170-1250)是歐洲數學復興的先驅,是13世紀最著名的義大利數學家.他在青少年時期遊歷許多國家,學習了許多國家的數學知識並在回國後整理研究,於1202年寫成名著《算盤書》.此書把阿拉伯數字介紹到歐洲,為阿拉伯數字在歐洲的流行起到了重要作用,是歐洲數學在經歷漫長黑夜之後走向復興的號角。
  • 斐波那契數列實戰解析
    斐波那契數列在實際操作過程中有兩個重要意義:第一個實戰意義在於數列本身。本數列前面的十幾個數字對於市場日線的時間關係起到重要的影響,當市場行情處於重要關鍵變盤時間區域時,這些數字判斷具體的變盤時間,概率極高,尤其是和一些重要事件發生共振之後,基本可以達到90%以上的概率。使用斐波那契數列時可以由市場中某個重要的階段變盤點向未來市場趨勢進行推演,到達時間窗口時市場發生方向變化的概率較大。
  • 王者技術之斐波那契數列
    「斐波那契數列(Fibonacci)」的發明者,是義大利數學家列昂納多·斐波那契(Leonardo
  • 我居然從一隻貓身上學到了斐波那契數列
    斐波那契數列(Fibonacci sequence)是由數學家列昂納多·斐波那契定義的把它寫成數列的形式是這樣的:正因為它的種種神奇性質,美國數學會甚至從1960年代起出版了《斐波納契數列》季刊。關於斐波那契數列,有一個恆等式是這樣的。
  • 利用斐波那契數列實現英裡和公裡轉換
    這個有趣的數學 trick 源於一個實證觀察和斐波那契數列。首先,我們定義英裡和公裡的關係:1英裡 = 1.60934公裡,1公裡 = 0.621371英裡如果看起來很熟悉,那是因為這些數字非常接近黃金分割率。
  • 她研究的斐波那契數列到底是啥?
    實際上,「斐波那契數列」指這樣一個數列: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377,…… 數列中的每1項稱為「斐波那契數」,從第3項開始,每1項都等於前2項之和。
  • 創造世間萬物的「兔子數列」與了不起的李奧納多
    比薩的李奧納多他還有另外一個名字叫,斐波那契(Leonardo Fibonacci 1175年-1250年),是中世紀義大利的數學家,他將現代書寫數和乘數的位值表示法系統引入歐洲。在他寫於1202年的著作《計算之書》中關於研究兔子繁殖的問題而有了「兔子數列」也就是後來的斐波那契數列。
  • Fibonacci 斐波那契數列的幾種寫法、時間複雜度對比
    我看在家修煉編程技術是不錯的選擇,「用Python實現斐波那契數列」是我們在知識星球中每周給大家安排的一道題,你也可以先思考一下有哪些實現方法,說不定哪天面試就能派上用場,終有一日當上CTO贏取白富美從此走上人生巔峰。
  • 感受數學的魅力,從此愛上數學
    題目一出來,笑笑就興奮地說他知道斐波那契數列。他們的奧數老師講過,這種規律數列,還叫「兔子數列」。他們奧數班還做過類似的題,比如:如果你爬10級臺階,每次可以爬1級或者2級,一共有幾種走法?等等。旁邊的笑笑爸爸連聲稱讚兒子很棒。並適時地和笑笑聊起了斐波那契數列。