计算某个数组的子集(在递归中不用for循环和visit数组,因为每个结果长度不一致,如果每个结果长度一致,比如求全排列,则需要用for和visit,但后者也可以用记录层数的方式)
public class Main {
public static void main(String[] args) {
int[] nums = {1,2,3};
List<List<Integer>> li = new ArrayList();
fin(nums,li,new ArrayList(),0);
System.out.println(li);
}
public static void fin(int[] n ,List<List<Integer>> li,List<Integer> cur,int idx) {
//idx用来记录层数,更重要的是记录当前层需要选择添加与否的元素下标
if(idx == n.length) {
li.add(new ArrayList(cur));
return;
}
//每层是可以选择不加这个数字
fin(n,li,cur,idx+1);
//每层可以选择添加这个数字
cur.add(n[idx]);
fin(n,li,cur,idx+1);
//恢复现场
cur.remove(cur.size()-1);
}
}