求{1,2,3}的所有子集(除空)
1.思路
这里我们令序列{1,2,3}为数组arr,添加新的数组brr={0,0,0} 利用回溯法 如下所示,用1表示其在子集中,0表示不在。
1 2 3
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
2.上代码:
//递归
public static void fun(int[] arr,int[] brr,int i,int n){
if(i==n){
for (int j = 0; j < n; j++) {
if(brr[j]==1){
System.out.print(arr[j]+" ");
}
}
System.out.println();
}
else {
brr[i]=1;
fun(arr,brr,i+1,n);
brr[i]=0;
fun(arr,brr,i+1,n);
}
}
//非递归
public static void NiceFun(int[] arr,int[] brr,int n){
int i=0;
brr[i]=-1;
while (i>=0){
brr[i]+=1;
//说明这种情况已经输出 则回退
if(brr[i]==2)--i;
//到了数组最后 将为1的输出
else if(i==n-1){
for (int j = 0; j < n; j++) {
if(brr[j]==1){
System.out.print(arr[j]);
}
}
System.out.println();
}
else {
++i;
brr[i]=-1;
}
}
}
public static void main(String[] args) {
int[] arr={1,2,3};
int[] brr={0,0,0};
fun(arr,brr,0,3);
NiceFun(arr,brr,3);
}
注意利用递归算法时:其递归过程最终的结果如图(左边为0,右边为1):