递归
算法思想
- 要懂得如何将一个问题的规模变小
- 再利用从小规模问题只的结果
- 结合当前的值或者情况,的出最终的结果
通俗理解
- 把要实现的递归函数,看成已经实现好的,
- 直接利用解决一些子问题
- 思考:如何根据子问题的解以及当前面对的情况得出答案
递归写法结构总结
function fn(n){
//第一步:判断输入或者状态是否非法
if(input/state is invalid){
return;
}
//第二部;判断递归是否应该结束?
if(match condition){
return some value;
}
//第三部:缩小问题规模
result1 = fn(n1);
result2 = fn(n2)'
.......'
//第四部:整合结果
return combine(result1,result2);
}
递归算法解决时间复杂度分析
- 迭代法
a\Roaming\Typora\typora-user-images\1585473715967.png)]
- 公式法(常用)
回溯
回溯算法是一种试探算法
在回溯算法中,是一步步向前试探,对每一步探测的情况评估,再决定是否继续,可避免走弯路
回溯精华
- 出现非法的情况时,可退到之前的情景,可返回一步或多步
- 再去尝试别的路径和办法
想要采用回溯算法,就必须保证:每次都有多种尝试的可能
回溯写法结构总结
function fn(n){
//第一步:判断输入或者状态是否非法
if(input/state is invalid){
return;
}
//第二部;判断递归是否应该结束?
if(match condition){
return some value;
}
//遍历所有可能出现的情况
for(all possible casses){
//第三部:尝试下一步的可能性
solution.push(case);
//递归
result=fn(m);
//第四部:回溯到上一步
solution.pop(case);
}
}
回溯例子
回溯其实是用递归实现的,因此在分析回溯时间复杂度时,其实就是在对递归函数进行分析,方法和之前介绍的一样