递归打印ArrayList的二进制子集

时间:2014-10-31 20:47:21

标签: java recursion arraylist binary

所以我一直在嘲笑我的大脑一段时间,而代码工作时,它以绝对错误的顺序打印它。我觉得我错过了一些东西所以我可以使用额外的一双眼睛。

void recursiveBitPatterns(ArrayList<String> subsets, int n)
{
    if (n==1)
    {
        subsets.add("0");
        subsets.add("1");
        return;
    }
    recursiveBitPatterns(subsets, n-1);
    int asize = subsets.size();
    for(int i=0; i<asize; i++)
    {
        String nsub = subsets.get(i);
        subsets.set(i, nsub +"0");
        subsets.add(nsub + "1");
    }
}

似乎是将arraylist的第二个元素设置为1但不在循环中覆盖它。

打印:

  

000   100   010   110   001   101   011   111

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

就我在你的代码中读到的那样,你试图从一组N个元素中生成所有可能的子集。

让子集成为存储子集的arraylist。

void gen(int N, int subset)  {
    if ( N < 0 ) {
        subsets.add( Integer.toBinaryString(subset) );
        return;
    }

    gen(N - 1, subset);
    gen(N - 1, subset | (1 << N) );
}

称之为:

gen( sizeOfSet - 1, 0 );

答案 1 :(得分:0)

你的代码看起来像。

void recursiveBitPatterns(ArrayList<String> subsets, int n)
{
    if (n==1)
    {
        subsets.add("0");
        subsets.add("1");
        return;
    }
    recursiveBitPatterns(subsets, n-1);
    int asize = subsets.size();
    for(int i=0; i<asize; i++)
    {
        String nsub = subsets.get(i);
        subsets.set(i, "0" + nsub);
        subsets.add("1" + nsub);
    }
}

打印:

000 001 010 011 100 101 110 111