在学习回溯算法之前,首先得知道递归算法,先来一个最简单的例子
#include <iostream>#include <vector>#include <array>using namespace std;void backtracking(int x) {if (x == 0)return;backtracking(x - 1);cout << x << endl;}int main() {backtracking(3);return 0;}
上述代码的输出结果为
可以看到,虽然3是最先进去的,但是却是最晚出来的。
而生活中的一些例子就是这样一个过程,比如对 x = {1, 2, 3, 4}进行组合,我们对它进行组合的规律是;
可以看到,1虽然是最先进去的,却是最后一个和其他数来交换的。和上面递归部分的思想不能说相似,只能是一摸一样。现在就是利用这种思想,来将这种组合问题来给实现。
循环加递归
最常用的二层循环如下
for (int i=1; i<4; ++i) {for (int j=i; j<4; ++j) {cout << i << ' ' << j << endl;}}

现在不适用二层循环,而是使用循环+迭代,它们之间碰撞出什么样的火花?
#include <iostream>#include <string>#include <vector>using namespace std;void RecursiveFunction(int x) {if (x==4) {return ;}for (int i=x; i<4; ++i) {cout << string(x - 1, '\t') << x << i << endl;RecursiveFunction(x+1);cout << string(x - 1, '\t') << x << i << endl;}}int main() {RecursiveFunction(1);}
输出如下:
为什么会产生这样的效果?主要是得益于栈这种结构的优点,而上述的循环+迭代可以被用于一些算法的实现,下面看一下是怎么使用他们的。
