关于递归的进一步的理解

1. 学习了关于深搜,二叉树,图论之后发现对于理解清楚递归来说是非常重要的,递归能够帮助我们干很多事情,而且在很多情况下只能使用递归来解决,比如涉及到不确定的情况下往往需要使用到递归,这也叫做深搜,尝试每一种的可能性,直到搜索完所有的路径之和,例如数独游戏就一定要使用到深搜才能够解决的,所以来说递归是非常重要的

① 深搜一般的套路是在for循环中进行递归,我们需要清楚的是在for循环中递归是一层套着一层的,而且深搜是一条路走到黑的,走到尽头之后那么会退回到上一个状态尝试其它的路径能否走通,直到走完所有的路径

可以结合数字三角形,数独游戏,八皇后问题、全排列问题等经典问题来进行理解

② 在对树的操作中,特别是遍历的操作,有前序遍历,中序遍历,后序遍历这些都是递归,可以结合树的三种遍历方式输出遍历结果来理解透彻递归,特别是中序遍历,在很多情况下都会使用到,而且掌握在中序遍历中左子树调用完退回来之后转态的处理是非常关键的(当退回到这里退回来的节点是以树中左--中--右的方式来进行返回的,这一点十分重要,我们在左子树调用完之后那么进行状态的处理,经典的例子就是判断一棵二叉树是否是二叉搜索树),还有就是求解某个节点的后继都需要使用到中序遍历,所以在对树的操作中递归是非常常见的

可以结合对于二叉搜索树的遍历,增加节点,删除节点,求解节点的高度,判断二叉树是否平衡来进行理解

③ 在图论中使用到深搜来遍历图的节点,在拓扑排序中也使用到了深搜来进行排序,其中在dfs退回来之后需要对退回来的状态进行处理,把相关位置进行标记,其中使用可以使用到标记来判断有向图是否有环

在图论中可以结合四连通、八连通简单问题理解深搜,拓扑排序来理解深搜

2. 递归求解需要注意一下几个问题

对于深搜而言注意的几个问题如下:

① 确定存在多少个的平行状态,即当前情况下需要调用多少次的dfs,比如数独游戏中每一个九宫格我们都可以尝试填进去1-9这九个数字所以存在九个平行状态,所以在for循环中使用递归表示这九个平行状态,对于二叉树的遍历过程中,要么遍历左子树要么遍历右子树所以存在两个平行的状态

② 确定dfs的参数,能够使用深搜来解决说明大问题与小问题之间的处理方式是一样的,这也是能够使用递归求解的本质所在

大问题会一步步在递归的过程中会转换为小问题,所以需要在dfs方法中传进来相应的参数才可以将大问题转化为小问题,传进来的参数是动态变化的

③ 出口的问题,递归不能够不停的调用,假如没有出口的话会造成堆栈的溢出,因为递归使用的是隐式的栈

递归的出口往往是问题求解过程中的临界状态或者问题的解决方案,这个时候需要思考临界状态下的参数的判断以便正常结束递归,return之后代码不会再往下执行并且函数会层层返回

④ 函数在碰到出口之后会层层返回,这个时候往往就需要对其返回的状态进行相应的的处理,这个在递归过程中是非常重要的,比如中序遍历的对其左子树调用完返回来的状态进行处理的情况,拓扑排序中对for循环调用完相应标志位的处理等都是非常重要的,这也是使用递归解决问题的关键所在

⑤ 有的时候需要进行回溯,在dfs的过程中有的时候对访问过的路径进行标记,但是退回来的时候我们需要把这些访问过的恒基都清除掉,因为在下一次尝试的过程中有可能访问到这个地方所以需要进行清除

猜你喜欢

转载自blog.csdn.net/qq_39445165/article/details/86841103