斐波那契問題

2022-01-20 03:26:31 字數 3328 閱讀 4905

斐波那契數列,指的是這樣乙個數列: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 

#include

"fibonacci.h

"int main(void

)long fibonacci(int

n)

return

result;

}

原先自己的第乙個思路是使用乙個long陣列存放斐波那契數列,在最後的第n位再把前兩項的數字相加返。但這樣做的話會浪費掉很多用不到的陣列記憶體,所以改進為使用3個變數,乙個記錄前乙個結果,乙個記錄當前結果,乙個做為中間的temp變數,作為乙個交換的介體。

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的個數不足找到的斐波那契數,用list【n】補齊

*/for(i=n+1; i<=fibonacci(k); i++)

由於斐波那契查詢是基於斐波那契數列的查詢,要求有序表的個數必須是存在於斐波那契數列中的數,所以在數不足的情況下,如n=10,fibonacci(7)=13 > 10,必須將有序表的個數擴增到等於斐波那契數,則list[11]=list[12]=list[13]=list[n]。

(2)

if(key 

else

if(key >list[mid])

在keylist [mid] 的情況下 k=k-2。這又是為什麼呢?

對於斐波那契查詢,分割是從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 ...