递归与递推
递推算法是一种简单的算法,递推通过已知条件,利用特定关系得出中间推论,直至得到结果的算法。
相对于递归算法,递推算法免除了数据进出栈的过程,不需要函数不断的向边界值靠拢,而直接从边界出发,直到求出函数值。
比如阶乘函数: f ( n ) = n ∗ f ( n − 1 ) f(n) = n * f(n - 1) f(n)=n∗f(n−1)。
递归中的表现是这样的:
f ( n ) f(n) f(n) -> f ( n − 1 ) f(n - 1) f(n−1) -> f ( n − 2 ) f(n - 2) f(n−2) -> … \dots … -> f ( 1 ) f(1) f(1) -> f ( 2 ) f(2) f(2) -> f ( 3 ) f(3) f(3) -> … \dots … -> f ( n ) f(n) f(n)
而递推则是:
f ( 1 ) f(1) f(1) -> f ( 2 ) f(2) f(2) -> f ( 3 ) f(3) f(3) -> … \dots … -> f ( n ) f(n) f(n)
很明显,递推效率更高。
例题
斐波那契数列,求第 n 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