- 递归的本质类似于循环,通过函数体来进行的循环,自己调自己(重复性)
- 向下进入到不同梦境中; 向上又回到原来一层
- 通过声音同步到上一层
- 每一层的环境和周围的人都是一份拷贝,主角等几个人穿越不同层级的梦境(发生和携带变化)
-
养成机械化记忆 * ` function recursion(leve1, ...params) { //recursion terminator 递归终结条件 if (level > MAX_LEVEL) { process_result return }
//process logic in current level 处理当前层逻辑
//drill down 下探到下一层 recurion(level + 1, ...params);
//reverse the current level status if needed 清理当前层 } `
- 1.不要人肉递归(直接看函数本身即可)
- 2.找到最近最简办法,将其拆解成可重复解决的问题(重复子问题!!!)
- 3.数学归纳法
特殊的递归
本质:找出重复性 分治代码模板
function divide_conquer(problem, ...params) {
// recursion terminator
if (problem === null) {
print_result
return
}
// prepare data 处理当前层逻辑(把大问题拆成多个小问题)
data = prepare_data(problem)
subproblems = split_problem(problem, data)
// conquer subproblems 下探到下一层
subresult1 = divide_conquer(subproblems[0], ...ps);
subresult2 = divide_conquer(subproblems[0], ...ps);
subresult3 = divide_conquer(subproblems[0], ...ps);
...
// process and generate the final result
result = process_result(subresult1, subresult2, subresult3, ...)
// revert the current level states
}
回溯法采用试错的思想,尝试分布的去解决一个问题,通常用递归法来实现 - 找到一个可能存在的正确答案 - 在尝试了所有可能的分步方法后宣传该问题没有答案 在最坏的情况下,回溯法会导致一次复杂度为指数时间的计算