回溯其实是递归的副产品,有递归就会有回溯。
效率
回溯并不高效,因为回溯的本质是穷举,遍历所有可能性。为了高效会加一些【剪枝】,但依旧改变不了穷举的本质。
它之所以存在就是因为一些问题只能用回溯。
用处
-
组合问题:N个数里面按一定规则找出k个数的集合
-
排列问题:N个数按一定规则全排列,有几种排列方式
-
棋盘问题:N皇后,解数独等等
-
子集问题:一个N个数的集合里有多少符合条件的子集
-
切割问题:一个字符串按一定规则有几种切割方式
算法模板
void backtracking(参数) {
if (终止条件) {
存放结果