一、概念/理解
递归:某个函数直接或者间接的调用自身。--->函数调用
函数调用:创建副本
递归函数:直接或者间接调用自身的函数叫 递归函数:
边界条件/递归出口:递归调用的终止条件。避免出现死循环或者爆栈的情况。//报错显示:TLE(超时) MLE(空间超限)--->找不全
返回到副本4里面的A()里继续执行下面的语句(如果有的话),执行完后再返回到副本3依次执行它A()下面的语句,依次返回。
递归体:
二、看懂递归代码
不清楚的话就画:递归调用图(上面的图就是)
三、写递归函数:
(1)搞清楚一次递归之后的结果是啥。
(2)写代码的时候不用往调用的深层次去想,直接把调用自身的语句当最终结果来看待
四、什么时候需要写递归:
想实现的大问题:可以被拆成一个一个有规律的小问题,并且原问题和这些小问题的解决逻辑f(x)是一样的。
例如:求1+2+3+...+(n-1)+n=?
把它换成求(a代表前面的加合)a+n=
a=1+2+3+...+(n-2)+(n-1)
a1+n-1
a1=1+2+3+...+(n-2)
//
1.是否真的需要递归:
刷算法题用的多-->使代码简洁且不会引发太大问题
工程开发很少用或禁止==>容易出现爆栈的情况,使服务器瘫痪
递归的代码:都有非递归的方式
可以用栈来变成非递归的方式
2.对递归优化:尾递归(上层调用下层的时候把上层覆盖)--->编译器(支持/不支持 不支持不行)
代码层面:递归调用的语句要在最后。