(1)递推与递归:
1,从程序上看,递归表现为自己调用自己,递推则没有这样的形式。
2,递归是从问题的最终目标出发,逐渐将复杂问题化为简单问题,最终求得问题
是逆向的。递推是从简单问题出发,一步步的向前发展,最终求得问题。是正向的。
3,递归中,问题的n要求是计算之前就知道的,而递推可以在计算中确定,不要求计算前就知道n。
4,一般来说,递推的效率高于递归(当然是递推可以计算的情况下)
例子如下面的斐波那契数列:
总结成公式就是F(n+1)=F(n)+F(n-1), F(0)=F(1)=1;
你可以用递归的方法写这个函数:
int F(int n) {
if (n<2) return 1;
else return F(n-1)+F(n-2);
}
但也可以用递推的方式:
int F(int n) {
if (n<2) return 1;
int f0=1, f1=1, f;
for (int i=0; i<n-1; i++) {
f=f0+f1;
f1=f; f0=f1;
}
}
(2)递推、贪心、搜索和动态规划
参考:https://www.zhihu.com/question/23995189
一个问题是该用递推、贪心、搜索还是动态规划,完全是由这个问题本身阶段间状态的转移方式来决定的。
每个阶段只有一个状态->递推
每个阶段的最优状态都是由上一个阶段的最优状态得到的->贪心
每个阶段的最优状态可以从之前的某个阶段的某个或某些状态直接得到而不管之前这个状态是如何得到的->动态规划
每个阶段的最优状态是由之前所有阶段的组合得到->搜索