遞迴與遞推
遞推演算法是一種簡單的演算法,遞推透過已知條件,利用特定關係得出中間推論,直至得到結果的演算法。
相對於遞迴演算法,遞推演算法免除了資料進出棧的過程,不需要函式不斷的向邊界值靠攏,而直接從邊界出發,直到求出函式值。
比如階乘函式:\(f(n) = n * f(n - 1)\)。
遞迴中的表現是這樣的:
\(f(n)\) -> \(f(n - 1)\) -> \(f(n - 2)\) -> \(\dots\) -> \(f(1)\) -> \(f(2)\) -> \(f(3)\) -> \(\dots\) -> \(f(n)\)
而遞推則是:
\(f(1)\) -> \(f(2)\) -> \(f(3)\) -> \(\dots\) -> \(f(n)\)
很明顯,遞推效率更高。
例題
斐波那契數列,求第 \(n\) 個值。
跟著程式碼講:
// 設 f[i] 為斐波那契數列的第 n 項。
f[1] = 1;
f[2] = 1;
for (int i = 3; i <= n; i++)
{
f[i] = f[i - 1] + f[i - 2];
}
cout << f[n];
看的處理,遞推是線性演算法,時間複雜度明顯更低。
作者的話
作業:洛谷P1192