由于博客是写给自己看的,所以用到了大量简写题也没有写出来,有需要的可以联系我要题目的pdf,本章ppt,讲义以及题目测试数据,由于上传不方便我就不上传了,联系邮箱SindarDawn@163.com
递归
一.基本概念:
1.定义:函数内部操作又直接或间接地出现对自身的调用的程序嵌套;
2.含义:把一个大型复杂问题层层转化为一个与原问题相似的规模较小的问题来求解,用少量程序来描述解题过程中所需要的重复计算,定义对象的无限集合(包括dfs);
3.要素:规模减小,有边界,子问题解决方法同原问题;
4.执行:先进行对下一层的运算,到最小一层可以很清晰地解决后再返回来解决这一层;
5.对比:除了小部分无法确定初始状态或变量不好携带的题以外,大多数使用递归的题都可以使用层次递推,且递推比递归往往有着更好的实际运行速度,又往往更容易想出诸如前缀和或者公式之类的优化方式,所以即使递归容易入门可以先想,但想出后一定要再想想能不能用递推代替;
6.注意:设置递归边界时一定要保证所有情况下此条件都能得到满足(典型错误比如i从0开始自检却设置在等于1停止,用0判断停止却因为开始有-1操作而0变-1出不去,1变0无法执行);
二.典型模板:
1.二分递归,边界为相差《=1;
注意:边界的处理以及两个边界的取舍;
技巧:可以通过对=的取舍来在取相同中的最大或最小;
举例:二分找数;
2.操作随操作次数而变化的递归:
技巧:要改变的变量可以随函数带入,抓住本质在函数内部命名再进行迭代操作;
举例:汉诺塔输出操作过程(在递推处已证明正确性);
3.找到初值再操作的递归:
注意:要检查初值条件给的是否足够,是否一定能取到;
特点:在找到初值后再回来依次操作,其实是递推也能解决的问题(只要能知道起始点且没有太多不好携带的条件);
举例:求斐波那契数列,集合的划分;
4.记忆化搜索:
特点:这其实不算是一种模板,而更多地是一种优化方法,可以节省很多时间并且常常是正解,遵循的是剪去重复操作的原则;(涉及到加法所以O大概是n^2 /2的样子,和记忆加法的递推仍然是一样的;
举例:计数问题(求小于一半的数不断加在左边的可能性);
5.前缀和:
特点:这其实是递推才能有的优化方式,不过递推和递归息息相关所以提出来,这种思维非常重要!;尤其是还可以结合奇偶特性!
三.上手例题:
1.集合的划分 小黄2.4.5
非常典型的递推中的取或不取类问题,用这种2^n 的解决方法非常有效且适用范围广,有搜索的气息;
2.10进制转8进制 小黄 练习3
死过一次的题,把握进制的本质,熟练掌握常用方法,一个方法不好走就走另外一个一定要把方法优化;
3.双色hanoi塔问题:小黄 练习6
其实很容易发现和原来一点差别都没有,不过输出过程很经典,具体分析可参考上面;
4.背包问题: 小黄 练习7:
背包问题的愚蠢解法,很容易看出搜索“画出所有可能性”的性质;