斐波那契数列是刚开始学习递归的时候老师经常会引用的例子,其实质便是暴力递归,虽然简洁易懂,但是效率低下.
int fib(int N) {
if (N == 1 || N == 2) return 1;
return fib(N - 1) + fib(N - 2);
}
假如我们需要求f(20),我们需要求出f(19)与f(18),求f(19)又需要求出f(18)与f(17),最后直到f(1)与f(2),f(1)与f(2)结果已知,不用再向下递归,这样子做,算法的时间复杂度为 O(2^n),十分慢。这个算法存在大量重复计算,比如 f(18)
被计算了两次,而且你可以看到,以 f(18)
为根的这个递归树体量巨大,多算一遍,会耗费巨大的时间。这个算法及其低效。
为此我们可以设置一个数组备忘录,将结果存储在这个备忘录中,每次去备忘录中查询结果,去掉不必要的重复的计算。