回溯跟递归是相辅相成的,只要有递归就有回溯。
通常递归函数的下面就是回溯的逻辑。
回溯法实际上是一个纯暴力的搜索。
回溯法能解决哪些问题?
组合问题、切割问题、子集问题、排列问题、棋盘问题……
这些问题用传统的for循环嵌套是很难解决出来的。
回溯法可以抽象为一个树形结构——n叉树。
树的宽度通常是我们需要处理的集合的大小。
树的深度通常是递归的深度——纵方向用递归解决。
回溯法的模板:
void backtracking(参数){
if(终止条件){
收集结果;
return;
}
for(集合的元素集){
处理节点;
递归函数;
回溯操作;
}
return ;
}
回溯三部曲:
1.确定递归函数参数和返回值
2.确定终止条件
3.单层递归逻辑