总结一下效率低的递归实现(虽然效率低,但是因为这是一种紧凑的实现还可以用线性规划来优化)
分治递归就不总结了 ,总结一下子问题包含子子问题的那种递归
比较典型的问题有背包问题(《算法:C语言实现 1-4》)和钢条切割问题(《算法导论》)
- 递归调用的那个方法的返回其实是上一次的结果(我理解的不一定对)
//背包问题 注释掉的是书中的实现 但是我觉得改成①更容易理解 这也是算法导论里面的写法
for(i = 0, max = 0 ; i < items.length ; i++){
if((space = cap - items[i].size) > 0){
// if((t = knap(space) + items[i].val) > max){
// max = t;
// System.out.println(max);
// }
max = max(max, knap(space) + items[i].val);//①
}
}
//钢条切割
for (int i=1;i<=n;i++){
q=max(q,p[i]+cut_rod(p,n-i));
if (i==n){
System.out.println("最优解 : "+q);
}
}
递归实现是自顶向下的,每次调用会返回上一次的结果 所以max()方法中就是用此时的最大值和 上一次+这一次(背包必须容量够才可以) ,返回两个的较大值