数据结构与算法学习之路7--递归

252 阅读2分钟

递归的含义

递归是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法,方法或函数调用自身的方式称为递归调用,调用称为递,返回称为归。递归本身就是借助栈来实现的,只不过我们使用的栈是系统或者虚拟机本身提供。

递归满足的三个条件

  • 一个问题的解可以分为几个子问题的解。子问题为数据规模更小的问题
  • 这个问题与分解之后的子问题数据规模不同,但是求解思路是一样的
  • 存在递归的终止条件,否则就变成了无限循环

递归的实现

写地递归代码的关键是找到将大问题分解为小问题的规律,基于这个规律编写出递推公式,推敲出终止条件,结合递推公式和终止条件翻译为代码。

递归的常见问题以及解决方式

堆栈溢出。

函数在调用时会使用栈来保存临时变量,每调用一次函数都会将临时变量封装为栈帧压入内存栈,函数调用完成之后才会出栈,调用层次很深时一直入栈就可能导致栈溢出。
解决方案:在代码中手动限制递归调用的最大深度,如定义一个全局的变量

重复计算

从上面这个图中我们可以清晰地看出当计算f(5)时需要计算f(3),计算f(4)时也要计算f(3),这样就出现了重复计算。
解决方法:我们可以通过使用一个数据结构(如数组)来保存已经求过的f(k)的值,当递归使用这个f(k)时先判断是否求解过