從零開始學習C++之遞推

George222發表於2024-08-28

遞迴與遞推

遞推演算法是一種簡單的演算法,遞推透過已知條件,利用特定關係得出中間推論,直至得到結果的演算法。

相對於遞迴演算法,遞推演算法免除了資料進出棧的過程,不需要函式不斷的向邊界值靠攏,而直接從邊界出發,直到求出函式值。

比如階乘函式:\(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

相關文章