在学习回溯算法之前,首先得知道递归算法,先来一个最简单的例子
#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);
}
输出如下:
为什么会产生这样的效果?主要是得益于栈这种结构的优点,而上述的循环+迭代可以被用于一些算法的实现,下面看一下是怎么使用他们的。