【问题标题】:Recursively print Binary subsets of an ArrayList递归打印 ArrayList 的二进制子集
【发布时间】:2014-10-31 20:47:20
【问题描述】:

所以我一直在为此绞尽脑汁,虽然代码有效,但它以绝对错误的顺序打印它。我觉得我错过了一些东西,所以我可以多用一双眼睛。

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

任何帮助将不胜感激

【问题讨论】:

  • 代码应该做什么?什么输入产生了那个输出,你期望什么输出?
  • 您的意思是“打印一组 N 个元素中的所有子集”吗?
  • 这是 LSB 在前而不是 MSB 在前。
  • @VitJaybird 我已经明白你想展示什么了。我已经修改了你的代码,看下面。

标签: java recursion arraylist binary


【解决方案1】:

你的代码看起来像。

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

【讨论】:

  • 谢谢!我想我的代码中只是有一个小问题。这很有帮助!
【解决方案2】:

据我在您的代码中看到的,您正在尝试从一组 N 个元素中生成所有可能的子集。

让子集成为存储子集的数组列表。

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 );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-21
    • 2018-08-30
    • 2014-04-12
    • 2019-09-09
    • 1970-01-01
    • 2021-02-02
    • 2015-01-15
    • 1970-01-01
    相关资源
    最近更新 更多