演算法 Fibonacci 數列的一類問題(一)

2021-09-25 09:52:07 字數 1309 閱讀 6311

fibonacci 是演算法中的基礎問題。還有一些問題本質是fibonacci 問題,也就是遞迴問題。在此我們一併總結**。

1.  fibonacci 數列

問題描述:

數列位數序號       1,2,3,4,5,6,...

fibonacci 數列     1,1,2,3,5,8,...

fibonacci 數列的性質很簡單,就是從第三位起,數列中每一項等於前兩項的和,如 第4項 = 第3項 + 第2項。

題目的要求是,輸入乙個整數n,輸出fibonacci 數列的第n項(從0開始,第0項為0)。

解決思路:

函式中遞迴呼叫自己,求出最終解。

def fibonacci(n):

if n < 2:

return n

else:

return fibonacci(n-1) + fibonacci(n-2)

2.  初級青蛙跳問題描述:

乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法(先後次序不同算不同的結果)。

解決思路:

乍一看,問題複雜。我們不妨做乙個帶入:

台階跳法共計跳法1

122    33

45我們觀察表的前2列,很容易得到規律,這是個fibonacci 問題。從第3階開始,第n階 = 第n-2階 + 第n-1階

我們依然用遞迴的思路寫出**

def jumpfloor(n):

if n < 3:

return n

else:

return jumpfloor(n-2) + jumpfloor(n-1)

3.  **青蛙跳問題描述:

乙隻青蛙一次可以跳上1級台階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上乙個n級的台階總共有多少種跳法。 

解決思路:

這似乎比初級青蛙跳複雜了很多,我們依然帶入尋找規律:

台階跳法共計跳法1

122    34

48我們進一步對跳法進行抽象。並令跳

進而得到

令兩式相減得到

如此,遞迴就可以很好的解決這個問題。

def jumpfloor(n):

if n < 2:

return n

else:

return 2 * jumpfloor(n-1)

每日一演算法 Fibonacci數列

fibonacci為1200年代的歐洲數學家,在他的著作中曾經提到 若有乙隻免子每個月生乙隻小免子,乙個月後小免子也開始生產。起初只有乙隻免子,乙個月後就有兩隻免子,二個月後有三隻免子,三個月後有五隻免子 小免子投入生產 如果不太理解這個例子的話,舉個圖就知道了,注意新生的小免子需乙個月成長期才會投...

計算Fibonacci數列

上機內容 用動態分配空間的方法計算fibonacci數列的前30項並儲存到動態分配的空間中 上機目的 學習fibonacci數列演算法 我的程式 includeusing namespace std void main int p new int 30 p 1 p 1 1 cout p p 2 fo...

Fibonacci數列 餘數

fibonacci數列的遞推公式為 fn fn 1 fn 2,其中f1 f2 1。當n比較大時,fn也非常大,現在我們想知道,fn除以10007的餘數是多少。輸入格式 輸入包含乙個整數n。輸出格式 輸出一行,包含乙個整數,表示fn除以10007的餘數。說明 在本題中,答案是要求fn除以10007的餘...