数据结构与算法之美——递归

递归的定义
递归,就是在运行的过程中调用自己。
递归是一种应用非常广泛的算法(或编程技巧)。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
举个例子:你带着女朋友去看电影,女朋友问:咱们现在坐在第几排啊?电影院非常黑,看不清,数不清,那该怎么办?这是,递归就排上了用场。于是,你就问前一排的人是第几排,前一排的人再向前问,一直问到第一排(递归前进段),第一排的人说我在第一排(边界条件),然后后面的再一排一排的把数字传回来(递归返回段),你就知道你在第几排了。
构成递归需具备的条件:
1. 一个问题的解可以分解为几个子问题的解;
2. 这个问题与分解之后的子问题,除了数据规模更小,求解思路完全一样;
3.存在递归终止条件。
写递归代码的关键就是找到如何将大问题分解为小问题,并且基于此写出递推公式,然后再判断终止条件,最后将递推公式和终止条件翻译成代码。只要遇到递归,就把它抽象成一个递推公式,不要去想一层层的调用关系,不要试图用人脑去分解递归的每个步骤。
递归代码要警惕堆栈溢出
函数调用会使用栈来保存临时变量,每调用一个函数,都会将临时变量封装为栈帧压入内存栈,等到函数执行完成返回时,再出栈。最大允许的递归深度和当前进程剩余的栈空间有关系。
递归代码要警惕重复计算
为了避免重复计算,我们可以通过一个数据结构(比如散列表)来保存已经求解过的f(k),在递归调用到时先看一下是否已经求解过。
递归有利有弊,利:代码表达力强,写起来简洁;弊:空间复杂度高,函数调用耗时较高,有堆栈溢出的风险。
 

猜你喜欢

转载自www.cnblogs.com/westCastle/p/10513438.html