import java.util.Scanner;
public class Main {
static int n;
static int a[];//0~n-1对应数字1~n,用于记录元素是否选择
//如果要保存结果信息可以创建一个二维数组p[n][n],在每次的递归出口处进行赋值
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
a = new int[n];//记录每个元素当前状态,0表示还没递归到,1表示选,-1表示不选
dfs(0);
scan.close();
}
//每个数都有选/不选两种可能性,递归遍历递归搜索树的每种情况,并将结果存入数组a[]中
public static void dfs(int k){
if(k == n){//边界,表示递归到最后一个数,将递归结果输出
for(int i = 0; i <n; i++){
if(a[i] == 1)
System.out.print((i+1)+" ");
}
System.out.println();
return;
}
//选择当前元素
a[k] = 1;
//继续向下递归
dfs(k+1);
//回溯,dfs(k++)递归完成后会返回到当前方法中,由于还有一种可能是当前元素不选,所以我们需要恢复现场信息,继续递归
a[k] = 0;
//不选当前元素
a[k] = -1;
//继续向下递归
dfs(k+1);
//回溯,恢复现场信息,因为要返回上一级方法继续递归
a[k] = 0;
}
}
递归实现指数型枚举
于 2023-03-20 14:40:49 首次发布