数据结构与算法:递归

1、什么是递归

递归是一种应用很是普遍的算法(或者说编程技巧)。很短数据结构和算法的编码实现都要用到递归,好比DFS深度优先搜索、先后中序二叉树遍历等等。算法

方法或者函数调用自身的方式称为递归调用,调用称为,返回称为编程

2、为何使用递归

递归的优势:代码表达能力强,写起来简洁,执行起来高效。数据结构

递归的缺点:空间复杂度高、有堆栈溢出的风险、存在重复计算、过多的函数调用会耗时较多数据结构和算法

3、什么样的问题可使用递归

递归使用的个条件:函数

1.一个问题的解能够拆解成为几个子问题的解;子问题就是数据规模更小的问题编码

2.此问题与分解以后的子问题,除了数据规模不一样,求解思路彻底同样翻译

3.存在递归终止条件,即不存在无限循环递归

4、如何实现递归

写递归代码的关键是找到如何将大问题分解为小问题规律,写出递推公式,找到终止条件,最后将递推公式和终止条件翻译成代码。内存

避免思惟误区:不要试图想清楚递归每一步的执行,这种试图想清楚整个递和归过程的想法,就是一个思惟误区。虚拟机

正确的思惟方式:若是一个问题A能够分解为子问题B、C、D,能够假设B、C、D已经解决,在此基础上思考如何解决问题A。而且,只须要思考问题A和子问题B、C、D、两层之间的关系便可,不须要一层一层往下思考子问题与子子问题,屏蔽掉递归细节,这样,理解起来就比较简单了。

所以,只要遇到递归,就把它抽象成一个递推公式,不用想一层层的套用关系,不要试图用人脑去分解递归的每一个步骤

5、递归的常见问题以及解决方案

递归代码要警戒堆栈溢出:函数调用会使用栈来存储临时变量,每调用一个函数,都会将临时变量封装为栈帧压入内存找,等到函数返回时,才会出栈。系统栈或者虚拟机栈空间通常都不大。若是递归求解的数据规模很大,调用层次很深,一直压入栈,就会有堆栈溢出的风险。

能够经过限制递归调用的最大深度来解决这个问题。

递归代码要警戒重复计算:为了不重复计算,咱们能够经过一个数据结构(好比散列表)来保存已经求解过的f(k)。当递归调用到f(k)时,先看是否已经求解过了。若是是,直接从散列表中取值返回,不须要重复计算。


小结:

递归是一种很是高效、简洁的编码技巧。只要知足“三个条件”的问题就能够经过递归代码来解决。

编写递归代码的关键是不要把本身绕进去,正确姿式是写出递推公式,找出终止条件,而后再翻译成代码

递归调用虽然简洁高效,可是递归代码也有弊端。好比堆栈溢出重复计算函数调用耗时多空间复杂度高等。写递归代码的时候。必定要控制好这些反作用

相关文章
相关标签/搜索