**一、递归 VS 循环**
递归:通过函数体来进行的循环。
汇编:它没有所谓的循环嵌套这一说,你之前有一段指令写在什么地方,你不断的跳到之前的指令的地方去执行那条指令,这就是递归。
**二,盗梦空间**
1,向下进入到不同梦境中;向上又回到原来一层。
2,通过声音同步回到上一层。
3,每一层的环境和周围的人都是一份拷贝、主角等几个人穿越不同层级的梦境(发生和携带变化)。
**三,递归套用的模板**
C/C++写法
```cpp
void recursion(int level, int param) {
// recursion terminator
if (level > MAX_LEVEL) { // 一、递归终结条件
// process result
return ;
}
// process current logic
process(level, param); // 二、处理当前层逻辑
// drill down
recursion(level + 1, param);// 三、下探到下一层
// reverse the current level status if needed // 四、清理当前层
}
```
java写法
```java
// Java
public void recur(int level, int param) {
// terminator
if (level > MAX_LEVEL) {
// process result
return;
}
// process current logic
process(level, param);
// drill down
recur( level: level + 1, newParam);
// restore current status
```
python写法
```python
def recursion(level, param1, param2, ...):
# recursion terminator
if level > MAX_LEVEL:
process_result
return
# process logic in current level
process(level, data...)
# drill down
self.recursion(level + 1, p1, ...)
# reverse the current level status if needed
```
JavaScript写法
```javascript
const recursion = (level, params) =>{
// recursion terminator
if(level > MAX_LEVEL){
process_result
return
}
// process current level
process(level, params)
//drill down
recursion(level+1, params)
//clean current level status if needed
}
```
**四,思维要点**
1,不要人肉进行递归(最大误区)
刚开始学,可以把状态树画出来。到后面了直接看函数本身开始写即可。
2,找到最近最简方法,将其拆解成可重复解决的问题(重复子问题)
3,数学归纳法思维。