递归 理论(肌肉记忆)
递归 循环
通过函数体来进行的循环
从前有座山
山里有个庙
庙里有个和尚讲故事
返回 71
就像盗梦空间
- 向下进入到不同的梦境中,然后又向上回到原来的一层
- 通过声音同步回到上一层
- 每一层的环境和周围的人都是一份拷贝,主角等几个人穿越不同层级的梦境(发生和携带变化)
递归就像剥洋葱,内部就是栈的形式
递归是有一个代码模板的
pyrhon形式
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, p2, ...)
# reverse the current level status if needed
javascript形式
function recursion(level, param1, param2, ...) {
// 递归终结条件(一开始就来写递归)
if(level > MAX_LEVEL) {
// 处理递归结果
process_result;
// 返回最终值
return;
}
// 处理当前层的逻辑
process(level, data);
// 下探到下一层,调用自身进行递归
recursion(level + 1, p1, p2, ...)
// 有时候这一层有一些东西需要清理,但是有时候又不用
}
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, new Param);
// restore current status
}
思维要点
- 不要人肉进行递归(最大误区,不要去画递归的状态树,直接看函数本身开始写即可,一定要熟练使用递归)
- 找到最近最简的方法,然后将其拆解成可以重复解决的问题(重复的子问题)
if for while else loop 然后就是 recursion - 数学归纳法思维(最开始 n=1 n=2 的时候成立 证明 n 成立的时候,n + 1 也成立)