[TOC] >[success] # 递归 ~~~ 1.递归应该一种比较常见的实现一些特殊代码逻辑时需要做的,但常常也是最绕的一种方式,在解释递归 之前,我们用循环和递归来做个比较 1.1.如果你打开一扇门后,同样发现前方也有一扇们,紧接着你又打开下一扇门...直到打开最后一扇门出去, 或者一直没有碰到尽头 (死循环)——'这就是循环' 1.2.如果你打开一扇门,紧接着你又用钥匙打开了这扇门,然后你又看到一扇们...但是当你开到某扇门时, 发现前方是一堵墙无路可走了,你选择原路返回——'这就是递归' 2.通过上面的故事可以发现递归其实是两个过程 2.1.'递'问题分解去的过程叫'递' -- 就像故事打开的门 2.2.'归'遇到终止'递'的条件叫'归' -- 就像故事里的墙 ~~~ >[info] ## 满足递归的条件 ~~~ 1.递归是一种解决问题的方法,它从解决问题的各个小部分开始,直到解决最初的大问题。递 归通常涉及函数调用自身 2.还是上面开门的故事,你想知道你开启的第一个门,实际是距离墙的第几扇门,这个问题想要解决 根据第一条的概念进行拆分 2.1.'分解成各个小部分',也就是我要知道我下一扇门距离墙是第几扇门 2.2.'这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样',我想知道开启第一扇门距离墙 是第几扇门,和我想知道下一扇门距离墙的位置是第几扇门是一样的 2.3.'存在递归终止条件',也就这些问题一层一层解析后,直到我知道扇的位置后终止,在一个个回来数 ~~~ >[danger] ##### 如何编写递归 * 引用极客时间王争老师的总结来说 ~~~ 1.写出递推公式,找到终止条件 2.写递归代码的关键就是找到如何将大问题分解为小问题的规律,并且基于此写出递推公式,然后再推敲终止条件, 最后将递推公式和终止条件翻译成代码 3.编写递归代码的关键是,只要遇到递归,我们就把它抽象成一个递推公式,不用想一层层的调用关系,不要试图用人 脑去分解递归的每个步骤 ~~~ >[danger] ##### 递归到底是个什么 ~~~ 1.递归就是栈一种应用场景,也遵循着'先进后出的原则(后进先出)' ~~~