标签:递归算法
1.递归定义:直接/简介调用自身方法的过程
2.递归优点:简单、优雅
3.递归思想:将问题规模减少,划分为同类型但规模减少的子问题
4.递归关键:递归出口
5.递归本质:函数重复调用自身,将其压栈至初始条件最后弹栈至空的过程。
6.递归举例:
7.递归辅助方法
有时,我们对递归进行改进,使其更为简便,尤其适用于数组和字符串问题。
本质上,递归辅助方法是重载的带额外参数的递归方法。
8.递归模板
如上图所示,递归包括两个要点,即递归出口和递归返回关联,通常通过if-else-if-else进行调整,if语句写出递归终止条件,如上图的left>right,然后用剩下的分支进行判断,返回。
9.递归优化
如何减少递归的复杂度呢?
方法1:尾递归
尾递归即递归方法调用完成后无其他任何操作,形式上看即return 递归方法名,而非尾递归还有其他操作,就会导致在当前调用栈中暂存递归返回的结果,占用了内存空间,尤其是递归深度较大时会消耗栈空间,故建议将其他形式的递归→尾递归方式。
如上图所示为 一般写法,即引入暂存结果的辅助参数result,不难发现,FacNew方法是尾递归,而原有的Fac调用了FacNew方法,这样就实现了尾递归。
【注意】可能你想问为何不直接修改Fac,其实可以,但是对于使用者而言,需求是给出数字n计算其阶乘,这样直接写对用户体验性不够好,建议封装为尾递归方式。
【注意】前面的二分查找,我们通过加入low和high参数实现了尾递归。
方法2:修改为非递归方式,即采用迭代等方法修改,如下所示为计算阶乘的迭代方式:
10.递归总结
当然,递归非常简便、直接和优雅,常用于汉诺塔等复杂问题给出清晰的思路,但是其时间复杂度和空间复杂度非常高,调用堆栈开销很大,故非必要,不要使用递归!



