斐波那契數列使用遞迴的執行時間分析

2021-07-24 16:40:36 字數 1868 閱讀 3039

前言

在這學期(大三上)去「蹭」了一次校招面試題,程式設計題中就有一道關於斐波那契數列的程式設計問題。如果不選擇遞迴求解,就需要說明原因。當時還沒怎麼接觸演算法這方面的知識(筆者非科班),關於什麼執行時間分析、空間複雜度分析的就是一臉懵逼,於是就描述了下可能會引發棧溢位的問題。在慢慢學習了一些演算法基礎之後,才明白那道題想考的就是關於執行時間的分析!

什麼都別說,先「走」兩步

下面是使用遞迴計算斐波那契數列第n項的例程:

long fib(int n)  else 

}

設t(n)為函式fib(n)的執行時間,當n ≤ 1時,執行時間等於某個常數值,也就是執行if條件判斷的時間,那麼t(0) = t(1) = 1(時間單位);

當n ≥ 2時,t(n) = t(n - 1) + t(n - 2) + 2(2表示執行條件判斷和加法的時間);

由fib(n) = fib(n - 1) + fib(n - 2), n ≥ 2,由歸納法可以證明t(n) ≥ fib(n),同理可證當n > 4時,fib(n) > (3 / 2) ^ n,也就是說(3 / 2) ^ n = o(t(n))

勘誤),即執行時間大於隨著n的增加呈指數增長的情形,可見此場景下如此使用遞迴效率的低下。 附:

證明1:

基準情形:t(0) = t(1) = fib(0) = fib(1) = 1

歸納假設:當0 ≤ n ≤ n,t(n) ≥ fib(n)

則只需證明t(n + 1) ≥ fib(n + 1)即可。

而t(n + 1) = t(n) + t(n - 1) ,由歸納假設可得:

t(n + 1) ≥ fib(n) + fib(n - 1)

=>

t(n + 1) ≥ fib(n) ,原命題得證。

證明2:

基準情形:fib(5) = 8 > ((3 / 2) ^ 5), fib(6) = 13 > ((3 / 2) ^ 6)

歸納假設:當4 ≤ n ≤ n時,fib(n) > ((3 / 2) ^ n)

則只需證明fib(n + 1) > ((3 / 2) ^ (n + 1)) 即可。

而fib(n + 1) = fib(n) + fib(n - 1) ,由歸納假設可得:

fib(n + 1) > (3 / 2) ^ n + (3 / 2) ^ (n - 1) => fib(n + 1) > (3 / 2) ^ (n + 1) ÷ (3 / 2) + (3 / 2) ^ (n + 1) ÷ (3 / 2) ^ 2 => fib(n + 1) > (3 / 2) ^ (n + 1) * (10 / 9) => fib(n + 1) > (3 / 2) ^ (n + 1)

在給出普通陣列和for迴圈的實現,以作對比:

for (int i = 0; i

< numberscount; i ++)

else

}

可以很容易得到執行時間t(n) = o(n),比起使用遞迴,執行時間被實質性的減少了。之所以這樣遞迴的執行時間開銷很大是因為做了很多重複的工作,也就是每求乙個數都需要遞迴到基準情形,n越大,兩次起始的遞迴交疊程度越大,效率自然而然就降低了!

總結在學習演算法的很短的日子了就深刻體會到了一點:學好數學很重要、

學好數學很重要、

學好數學很重要!特別是一些數學公式的記憶,比如讓你求等差數列的前項和,如果記不得公式,恐怕你就只有迴圈求解了,但如果你記得的話就是乙個公式就可以搞定的啊!當然,這只是乙個簡單的比喻,但本質的道理是相同的。所以如果你還有數學課,那麼且行且珍惜

在這裡敲打一遍幾個記法的定義,給自己長長記性:

可見,此處下這樣的定義是不恰當的。

遞迴與斐波那契數列

迭代實現 def fab n a1 1 a2 1 a3 1if n 1 print 輸入有誤 return 1 while n 2 0 a3 a1 a2 a1 a2 a2 a3 a 1return a3 result fab 20 if result 1 print 總共有 d對小兔子誕生 resu...

遞迴演算法斐波那契數列

有一對兔子,從出生後第3個月起,每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子。假如兔子都不死,求第n個月兔子對數 關於斐波那契數列的兔子繁殖問題其實如下 實際月份 123 4567 8幼仔對數 101 1235 8成兔對數 011 2358 13總體對數 112 35813 21幼仔對...

遞迴實現斐波那契數列

斐波那契數列 f 1 1,f 2 1,f n f n 1 f n 2 n 3,n n package com.algorithm.tiger.recursion 遞迴和非遞迴方法實現斐波那契數列 斐波那契數列 f 1 1,f 2 1,f n f n 1 f n 2 n 3,n n descripti...