1、fibonacci數列
「有小兔一對,若等二月它們成年,第三月生下一對小兔,以後每月生產一對小兔,而所生小兔亦在第二月成年,第三月生產另一對小兔,以後亦每月生產小兔一對。假定每生產一對小兔,必為一雌一雄,且均無死亡,試問一年後共有小兔幾對?
分析:首先觀察一下頭七個月的情況,為此引入下述記號,用
表示原來的一對小兔,(=1
,2……12
)表示第
個月生的一對小兔子,
表示第對小兔子兩個月以後又生的第
對小兔子,依次類推如表。 月份
對數 1 1
2 1
3 2
4 3
5 5
6 8
7 13
從表中可知七月份共有兔子
13對;還可看出,從三月份開始,每月的兔子總數恰好等於它前面兩個月的兔子總數之和。按這規律可寫出數列1、
1、2、
3、5、
8、13、
21、34、
55、89、
144可見一年後共有兔子
144對。我們這道題運用的是初等數學的歸那法,通過對問題的分析列表並計算得出結論。
這是乙個有限數列,按上述規律寫出無限數列就叫做
fibonacci
數列(這是為了紀念兔子繁殖問題的創始人義大利數學家裴波那契),其中的每一項叫做
fibonacci
數。若令
此數列有下面的遞推關係: ,
與fibonacci
數列緊密相關的乙個重要極限是
,這恰好是**分割比。除了與**分割有聯絡外,
fibonacci
數列還出現在為數眾多的領域,如某些葉子的排列,某些花的花瓣數,另外蜜蜂的家譜、鋼琴音階的排列也有該數列的特點。
2、fibonacci二叉樹的形成
1.以資料個數
n來決定
fibonacci為k
階(k-order)
j=0 fib(0)=0
j=1 fib(1)=1
j=2 fib(2)=1
j=3 fib(3)=2
j=4 fib(4)=3
…… j=nfib(n)= fib(n-1)+fib(n-2)
設計一最小的
k值,使得
fib(k+1)>n+1 2
.k=0
或k=1
則表示fibonacci
只有乙個結點,其餘別無它物。 3
.k>=2
,則表示
fibonacci
的根為fib(k)
,左子樹為(
k-1)階
fibonacci
樹(其根為
fib(k-1)
,右子樹為(
k-2)階
fibonacci
樹(其根為
fib(k)+fib(k-2)
),上面的演算法適用於
n+1值為
fibonacci
樹,若n+1
不為fibonacci
樹,則找出m使得
fib(k),再依上述演算法建立
fibonacci
樹,最後把
fibonacci
樹的各結點資料減去
m,就可以了。
3、fibonacci差值原則(1
)左子樹為負,右子樹為正。 (
2)如圖所示:
步驟:假設資料個數有n個
且n比某一fibonacci
數小,滿足下列的表示式,如下所示:
fa>=n+1 則
fa-1
就是這棵
fibonacci
樹的樹根,而
fa-3
則是開始的差值。如果我們要查詢乙個值
key。首先我們比較陣列索引和
key,而得到下列的三種情況,如下所示: 1.
當key
比較小,則我們查詢1到
fa-1-1
的資料。 2.
當key
比較大,則我們查詢
fa-1+1
到fa-1
的資料。 3.
當key
與陣列索引
fa-1
的值相等,表示查詢成功。 4.
繼續上述的步驟直到找到鍵值或
fibonacci
樹的差值為零。
c語言程式
fib=
intfib_search(int n,int key) }
else
if(key>data[mid-1].key)
if(fn1<=1)
mid=0;
else
else
return--mid; }
return
-1; }
例:利用斐波那契查詢法查詢某一數值資料
原始資料:
3416
27975428295
排序後的資料:
d[1]d[2] d[3] d[4] d[5] d[6] d[7]d[8]
916273442758295
利用演算法規則,生成斐波那契樹,如圖所示:
比如要查詢
key=34,
此時從樹根開始比較:
(1)當key>
樹根時,往右子樹根開始比較;
(2)當key<
樹根時,往左子樹根開始比較;
(3)當key=
樹根時,表示資料找到。
過程如下:
(1)key=34<82,
往左子樹查詢
->
第一次;
(2)key=34<42,
往左子樹查詢
->
第二次;
(3)key=34>27,
往右子樹查詢
->
第三次;
(4)key=34
,資料找到
->
第四次。
共查詢四次
效率:斐波那契查詢與折半查詢的時間複雜度間同為o(
log2(log2n)),
平均情況下,斐波那契查詢優於折半查詢,但最壞情況下則差於折半查詢。斐波那契查詢優點是只有加、減運算。折半查詢有除法運算。缺點是每次必須計算下個級數。
斐波那契 Fibonacci 數列
實踐證明,尾遞迴 確實比普通遞迴效率高。下面的例子 用 普通遞迴需要10s完成 而用尾遞迴,只用了1s不到 package com.zf.dg 題目 有一種母牛,出生後第三年,開始生育,每年都生一頭 母牛 貌似單性生育,這裡就沒公牛什麼事兒 生出來的小母牛也符合同樣的規律,出生後第三年,開始生 育,...
Fibonacci 斐波那契數列
一 介紹 在數學上,費波那契數列是以遞迴的方法來定義 0 f 0 1 f 1 f f f f f n 2 用文字來說,就是費波那契數列由0和1開始,之後的費波那契係數就是由之前的兩數相加而得出。首幾個費波那契係數是 0,1,1,2,3,5,8,13,21,34,55,89,144,233 oeis中...
斐波那契數列(Fibonacci)
斐波那契數列 無窮數列 1,1,2,3,5,8,13,21,34,55.稱為fibonacci數列。它可以定規地定義為 n 0,1 f n 1 n 1 f n f n 1 f n 2 這是乙個遞迴的關係式,它說明當n大於1時,這個數列的第n項的值,是它前面兩項的和,它用兩個較小的自變數的函式值來定義...