斐波那契數列,指的是這樣乙個數列:1、1、2、3、5、8、13、21...,除第1,2位的數為1外,其他數為前兩位數字的相加之和。
1.斐波那契數列與經典兔子繁殖問題
一般而言,兔子在出生兩個月後,就有繁殖能力,一對兔子每個月能生出一對小兔子來。如果所有兔都不死,那麼在有1個月大的一對兔子的條件下一年以後可以繁殖多少對兔子?
我們可以分析一下。
第乙個月一對兔子a生出一對小兔b。
第二個月還是原來的一對兔子a生出一對小兔c。
第三個月a生出一對小兔d,b生出一對小兔e。
第四個月a生出一對小兔f,b生出一對小兔g,c生出一對小兔h。
依次類推......如下表所示:月份1
2345
6789
1011
12每個月新出生的兔子對數11
2358
1321
3455
89144
一年後繁殖的兔子對數量為:1+1+2+3+5+8+13+21+34+55+89+144
2.c語言使用遞迴來實現斐波納契數列
fibonacci.h
long fibonacci(int n);遞迴實現菲波那契數列
#include #include遞迴帶來的好處是使演算法變得更加簡明,可讀性高。然而,使用遞迴也帶來了額外的記憶體開銷.可以考慮使用迭代實現斐波那契。#include
"fibonacci.h
"int main(void
)long fibonacci(int
n)
3.c語言使用迭代來實現斐波那契數列
迭代實現斐波那契數列
#include #include原先自己的第乙個思路是使用乙個long陣列存放斐波那契數列,在最後的第n位再把前兩項的數字相加返。但這樣做的話會浪費掉很多用不到的陣列記憶體,所以改進為使用3個變數,乙個記錄前乙個結果,乙個記錄當前結果,乙個做為中間的temp變數,作為乙個交換的介體。#include
"fibonacci.h
"int main(void
)long fibonacci(int
n)
return
result;
}
4.斐波那契查詢
斐波那契數列又稱為**分割數列。為什麼叫做**分割數列呢?理由是當n趨近於無窮大的時候,後一項和前一項的比值越來越接近**分割1.618. 3/2=1.5,5/3=1.666,8/5=1.6,13/8=1.625...
數學背景:數字0.618…更為數學家所關注,它的出現,不僅解決了許多數學難題(如:十等分、五等分圓周;求18度、36度角的正弦、余弦值等),而且還使優選法成為可能。優選法是一種求最優化問題的方法。如在煉鋼時需要加入某種化學元素來增加鋼材的強度,假設已知在每噸鋼中需加某化學元素的量在1000—2000克之間,為了求得最恰當的加入量,需要在1000克與2000克這個區間中進行試驗。通常是取區間的中點(即1500克)作試驗。然後將試驗結果分別與1000克和2000克時的實驗結果作比較,從中選取強度較高的兩點作為新的區間,再取新區間的中點做試驗,再比較端點,依次下去,直到取得最理想的結果。這種實驗法稱為對分法。但這種方法並不是最快的實驗方法,如果將實驗點取在區間的0.618處,那麼實驗的次數將大大減少。這種取區間的0.618處作為試驗點的方法就是一維的優選法,也稱0.618法。實踐證明,對於乙個因素的問題,用「0.618法」做16次試驗就可以完成「對分法」做2500次試驗所達到的效果。因此大畫家達·芬奇把0.618…稱為**數。
斐波那契查詢
#include #define max_size 30對斐波那契查詢可能存在兩個比較難理解的地方。int fibonacci(int
n);int main (void
) printf(
"please input the key:");
scanf("%d
",&key);
/*比較找到不小於n的斐波那契數的位置
*/int k = 1
;
while(n>fibonacci(k))
/*在n的個數不足找到的斐波那契數,用list【n】補齊
*/for(i=n+1; i<=fibonacci(k); i++)
/*定義key的位置
*/int pos = -1
;
intlow,high,mid;
low = 1
; high =n;
while(low <=high)
else
if(key >list[mid])
else
else}}
printf(
"the result position is %d.
",pos);
return0;
}int fibonacci(int
n)
return
result;
}
(1)
/*由於斐波那契查詢是基於斐波那契數列的查詢,要求有序表的個數必須是存在於斐波那契數列中的數,所以在數不足的情況下,如n=10,fibonacci(7)=13 > 10,必須將有序表的個數擴增到等於斐波那契數,則list[11]=list[12]=list[13]=list[n]。在n的個數不足找到的斐波那契數,用list【n】補齊
*/for(i=n+1; i<=fibonacci(k); i++)
(2)
if(key在keylist [mid] 的情況下 k=k-2。這又是為什麼呢?else
if(key >list[mid])
對於斐波那契查詢,分割是從mid =low + fibonacci(k-1) -1 開始的,現在陣列的長度為fibonacci(k),mid 將陣列分為兩個部分,前一部分為[1,mid],長度為fiboncaai(k-1),則後一部分的長度為fibonacci(k)-fibonacci(k-1),根據斐波那契的性質,f(k) - f(k-1) = f(k-2),則後一部分的長度為fibonacci(k-2),所以當key > list[mid] 的時候 k = k - 2。
斐波那契的時間複雜度也為o(log n),相對與擇半查詢進行加法與除法運算(mid=(low + high)/2 ),斐波那契查詢只是最簡單加減法運算( mid = low + fibonacci(k-1) -1 ),在海量資料的查詢過程中,這種細微的差別可能會影響最終的查詢效率。
斐波那契問題
there are another kind of fibonacci numbers f 0 7,f 1 11,f n f n 1 f n 2 n 2 input input consists of a sequence of lines,each containing an integer n....
斐波那契裝箱問題
說明 題目 國際大學生程式設計競賽中山大學內部選拔真題解二 遺留問題 這本書的第一題,題目測試和解答測試資料不一致,所以應該是解答有誤,但我現在也想不到解決辦法,就先貼出來,以後有思路過來完成它 題目 題目給出測試資料 這本書的解答 有修改 include define maxn 64 intx m...
斐波那契數列 斐波那契數列python實現
斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞推的方法定義 f 1 ...