递推与递归的定义:
递归与递归是一个互逆的过程。
递推:从前往后推,符合人的思路
递归:从后往前推,是计算机的思维
辛苦老师了!!!
讲得很有道理啊,一个一个把它表示出来
第一个用二进制表状态,第二个用数组表状态
#include <iostream>
using namespace std;
int n;
void dfs(int u, int state){
if(u == n){
for(int i = 0; i < n; i ++)
if(state >> i & 1)
cout << i + 1 << " ";
cout << endl;
return;}
dfs(u + 1, state);//位置根据要求变化
dfs(u + 1, state | (1 << u));//把state的第u位置成1
//2的u次方就只有u位是1,其他都是0,与state或一下,改变state的第u位,使其变成1,而其他位不变
//其实用数组意思也一样,没什么优点(就快一些?
}
int main(){
cin >> n;
dfs(0, 0);
return 0;
}
#include <iostream>
using namespace std;
const int N = 20;
int n;
bool st[N];
void dfs(int u){
if(u > n)
{
for(int i = 1;i <= n; i ++)
{
if(st[i]) cout << i << ' ';
}
cout << endl;
return;
}
st[u] = true;
cout << "good" << endl;//保留做个纪念
dfs(u + 1);
st[u] = false;
cout << "hello" << endl;//嗯
dfs(u + 1);
}
int main(){
cin >> n;
dfs(1);
return 0;
}
也可以用数组,说实话第二个还不是很懂
#include <iostream>
using namespace std;
int n, m;
void dfs(int u, int state, int q){
if(q + n - u < m) return;
if(q == m){
for(int i = 0; i < n; i ++)
if(state >> i & 1) cout << i + 1 << " ";
cout << endl;
return;
}
dfs(u + 1, state | (1 << u), q + 1);
dfs(u + 1, state, q);
}
int main(){
cin >> n >> m;
dfs(0, 0, 0);
return 0;
}
#include <iostream>
using namespace std;
const int N = 30;
int path[N];
int n, m;
void dfs(int u, int start){
if(u > m){
for(int i = 1; i <= m; i++){
cout << path[i] <<' ';
}
cout << endl;
}
else{
for(int i = start; i <= n; i++){
path[u] = i;//u
dfs(u + 1, i + 1);
path[u] = 0;
}
}
}
int main(){
cin >> n >> m;
dfs(1, 1);
return 0;
}
1.状态判断位置不一样了;
2.排列型是填坑,之前的是选择,所以加了个循环,目的不一样了;
3.因为有顺序加了个vector;
4.U永远都是表示是在哪一层 。
#include <iostream>
#include <vector>
using namespace std;
int n;
vector<int> path;
void dfs(int u, int state){
if(u == n){
for(auto x : path) cout << x << ' ';
cout << endl;
return;
}
for(int i = 0; i < n; i ++){
if(!(state >> i & 1)){//还没遍历到的
path.push_back(i + 1);
dfs(u + 1, state | 1 << i);
path.pop_back(); //还原到原来的位置
//还在循环
}
}
}
int main(){
cin >> n;
dfs(0, 0);
return 0;
}