一、简单递归的实现
int f1(int n)
{
if (n == 0)
{
return 0;
}
if (n == 1)
{
return 1;
}
return f(n - 1) + f(n - 2);
}
但是,这个函数去执行的时候,会发现非常的慢。那是什么原因呢?
我们仔细观察一下,每一次递归的时候,我们都会调用两个,所以,计算时,从n、n-1、… 0会是一个金字塔,二叉树的分布,也就是靠近0的底层,会有2^n次运算,就是一个指数级运算,计算时间复杂度为O(2^n),运算速度是非常慢的。
原因是什么呢?假如,我们计算的是10,那么它相应的要计算 9 + 8,而9要计算 8 + 7, 8又要计算 7 + 6.相当于越往底层去,计算的次数越多:
10
/ \
9 8
/ \ / \
8 7 7 6
可见递归算法由于会多次计算同样的子问题而出现效率低下的问题,为了避免重复计算子问题,提升算法的效率,可以使用动态规划的思维来改进算法
二、动态规划算法
使用一个数组来记录各个子问题的解,当再一次遇到这一问题的时候直接查找数组来获得解避免多次计算子问题。
int f2(int a[],int n)
{
if (n == 0)
{
a[0] = 0;
return 0;
}
if (n == 1)
{
a[1] = 1;
return 1;
}
if (a[n] >= 0)
{
return a[n];
}
a[n] = f(a, n - 1) + f(a, n - 2);
return f(a, n - 1) + f(a, n - 2);
}