遞迴關係式與主定理

展開線性遞迴式(unrolling a linear recurrence)

並非所有遞迴式都來自平衡的分治;許多來自對「稍微小一點」的輸入做單一遞迴呼叫,像 T(n) = T(n-1) + 某個東西。主定理不適用(它是為 T(n/b) 而非 T(n-1) 打造的),但有個更簡單的工具:就一步步把遞迴式展開,直到看出規律,再加總。

展開(也叫迭代法)的意思是把遞迴式反覆代入自己。取 T(n) = T(n-1) + n。代入:T(n) = T(n-2) + (n-1) + n = T(n-3) + (n-2) + (n-1) + n,一路往下到基底情況 T(0) = 0,得 T(n) = n + (n-1) + ... + 1 = sum from i=1 to n of i = n(n+1)/2 = Theta(n^2)。整個方法就是:展開 k 次以看出一般項,把 k 一路推到基底情況,再認出所得的和(等差級數、等比級數或調和級數)。T(n) = T(n-1) + 1 展開成 n 步的計數,故 Theta(n);T(n) = 2 T(n-1) + 1 展開成等比和 1 + 2 + 4 + ... + 2^(n-1),故 Theta(2^n)。

當子問題規模以「相減」而非「相除」遞減時,展開是最透明的方法——它出現在「每次剝掉一個元素」的遞迴,以及分析簡單迴圈時。誠實的告誡是:要把展開一路推到基底情況,並正確數出項數:在「碰到基底前能減幾次」上差一,會改變一個常數;但更危險的是,把級數種類數錯(等差還是等比)會徹底改變漸進行為——n(n+1)/2 是 Theta(n^2),但等比的 2^n 則指數級地更糟。

T(n) = T(n-1) + c(每步常數工作)展開成 T(n) = T(0) + c*n = Theta(n)——一次線性掃描。但 T(n) = 2 T(n-1) + 1 展開成 2^n - 1 = Theta(2^n)——樸素遞迴費氏數列式的爆炸。同樣是「減一」的縮小,因為乘數 2,總量天差地別。

把遞迴式展開成級數再加總:等差給 Theta(n^2),等比可能給 Theta(2^n)。

要正確辨認級數:遞迴項前的領導係數大於 1(像 2 T(n-1))會讓和變成等比、答案變指數,而係數為 1(T(n-1))通常給多項式成長。看錯這點,是最容易把答案差到一個指數的方式。

又稱
iteration methodtelescopingexpanding the recurrence迭代法逐層展開