参考资料:
代码随想录,回溯
递归,dfs,bfs,回溯的联系与区别
概念
- 概念:枚举问题的每一种解,过程通常为 选择->递归->回溯,回溯也就是撤销前一步的选择
- 条件:
- 时间复杂度:暴力搜索法的一种
- 其他:
- 可形成树形结构
- 可通过剪枝优化
- 回溯主要体现的是不断试错及回退的算法思想,而递归主要的是指函数调用自身的算法操作,通常使用递归来实现回溯
- BFS是用于遍历多维数据结构的算法,而其搜索过程很符合回溯的思想
代码
以组合问题为例,给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合
其中,可以设计传入参数为temp_result,每次递归传入temp_result+i,可以省略回溯的步骤
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<vector<int> result;
vector<int> temp_result;
void recursion(int n, int k, int begin_index)
{
// 递归终止条件
if (temp_result.size() == k)
{
result.push_back(temp_result);
return;
}
for (int i = begin_index; i <= n; ++i)
{
temp_result.push_back(i);
// 可以设计传入参数为temp_result,每次递归传入temp_result+i,可以省略回溯的步骤
recursion(n, k, i + 1);
temp_result.pop_back();
}
}
vector<vector<int>> combine(int n, int k)
{
recursion(n, k, 1);
return result;
}