分析遞歸函數(或者甚至是評估它們)是一個平凡的任務。A(在我看來)很好的介紹可以在唐Knuths找到Concrete Mathematics。
但是,現在我們來分析這些示例:
我們定義了一個函數,它給了我們函數所需的時間。假設t(n)
表示pow(x,n)
所需的時間,即n
的函數。
那麼我們可以得出結論,即t(0)=c
,因爲如果我們調用pow(x,0)
,我們要檢查是否(n==0
),然後返回1,它可以在固定時間(因此不斷c
)來完成。
現在我們考慮另一種情況:n>0
。我們在這裏獲得t(n) = d + t(n-1)
。這是因爲我們再次檢查n==1
,計算,因此(t(n-1)
),並將結果乘以x
。檢查和乘法可以在恆定時間內完成(常數d
),遞歸計算pow
需要t(n-1)
。
現在,我們可以在 「擴展」 一詞t(n)
:
t(n) =
d + t(n-1) =
d + (d + t(n-2)) =
d + d + t(n-2) =
d + d + d + t(n-3) =
... =
d + d + d + ... + t(1) =
d + d + d + ... + c
那麼,如何長時間才能,直到我們達到t(1)
?由於我們從t(n)
開始,我們在每一步中減去1,因此需要n-1
步驟才能達到t(n-(n-1)) = t(1)
。另一方面,這意味着,我們得到n-1
倍的常數d
,t(1)
評估爲c
。
所以我們得到:
t(n) =
...
d + d + d + ... + c =
(n-1) * d + c
所以我們得到了t(n)=(n-1) * d + c
這是O(n)的元素。
pow2
可以使用Masters theorem來完成。因爲我們可以假設算法的時間函數是單調遞增的。所以現在我們有必要爲pow2(x,n)
計算時間t(n)
:
t(0) = c (since constant time needed for computation of pow(x,0))
爲n>0
我們得到
/t((n-1)/2) + d if n is odd (d is constant cost)
t(n) = <
\ t(n/2) + d if n is even (d is constant cost)
上面可以 「簡化」 到:
t(n) = floor(t(n/2)) + d <= t(n/2) + d (since t is monotonically increasing)
所以我們獲得t(n) <= t(n/2) + d
,這可以使用主人定理到t(n) = O(log n)
來解決(參見應用於Popul ar維基百科鏈接中的算法,例如「二進制搜索」)。
*這兩個函數的複雜性是O(1)* - 什麼? – kennytm 2010-04-25 17:32:28
這是O(1)忽略遞歸調用,但可以用不同的方式表示。重點是總的複雜性僅取決於遞歸深度。 – fgb 2010-04-25 17:39:57