递归的含义
递归是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法,方法或函数调用自身的方式称为递归调用,调用称为递,返回称为归。递归本身就是借助栈来实现的,只不过我们使用的栈是系统或者虚拟机本身提供。
递归满足的三个条件
- 一个问题的解可以分为几个子问题的解。子问题为数据规模更小的问题
- 这个问题与分解之后的子问题数据规模不同,但是求解思路是一样的
- 存在递归的终止条件,否则就变成了无限循环
递归的实现
写地递归代码的关键是找到将大问题分解为小问题的规律,基于这个规律编写出递推公式,推敲出终止条件,结合递推公式和终止条件翻译为代码。
递归的常见问题以及解决方式
堆栈溢出。
函数在调用时会使用栈来保存临时变量,每调用一次函数都会将临时变量封装为栈帧压入内存栈,函数调用完成之后才会出栈,调用层次很深时一直入栈就可能导致栈溢出。
解决方案:在代码中手动限制递归调用的最大深度,如定义一个全局的变量
重复计算
解决方法:我们可以通过使用一个数据结构(如数组)来保存已经求过的f(k)的值,当递归使用这个f(k)时先判断是否求解过