0

假设n = 7,所以我需要显示由1和2组成的7位数字的所有可能组合:1111111 1111112 1111121 1111211 1112111 .... 2222222 这是我的代码,但它是硬编码的嵌套7次循环. 所以我的 count=128 是 2^7 但是如何以编程方式使其嵌套 n 次?我认为它需要一些递归,但怎么做呢?

int count = 0;
    for (int j = 1; j<=2; j++) {
        for (int z= 1; z<=2; z++) {
            for (int i = 1; i<=2; i++) {
                for (int k = 1; k<=2; k++) {
                    for (int l= 1; l<=2; l++) {
                        for (int m = 1; m<=2; m++) {
                            for (int y = 1; y<=2; y++) {
                                count++;

                                System.out.println(count+":"+j+z+i+k+l+m+y+",");

                            }
                        }
                    }       
                }
            }
        }
    }
4

4 回答 4

5

通常,“N 个符号的所有组合”与“以 N 为基数计数”相同。

既然你有两个符号,那就更容易了。从 0 数到X,得到每个数的二进制表示,替换02。一旦二进制表示的长度超过您想要的值的数量,请停止。

不要忘记将前导添加2到太短的数字。

于 2013-11-11T00:43:30.637 回答
2

我非常喜欢混淆版本.... ;-) :

    final int l = 7;
    long m = 1 << l;
    while (--m >= 0) {
        int b=l;
        while (--b >= 0) {
            System.out.print(((m >> b)& 1 ) + 1);
        }
        System.out.println();
    }
}

编辑:我应该添加对上述内容的描述......我所做的只是倒计时2^7 - 1,然后打印每个值中设置的位(打印2位值 1,打印1位值 0);

于 2013-11-11T00:46:47.637 回答
1

使用递归。您应该计划传入部分构建的字符串以及剩余的位数。我将在这里连接字符串,尽管通常应该使用 StringBuilders。

public static void printOutString(int levelsRemaining, String current){
    if(levelsRemaining==0) System.out.println(current);
    else{
        printOutString(levelsRemaining-1, current+"1");
        printOutString(levelsRemaining-1, current+"2");
    }
}

您还可以使用迭代方法:

public static ArrayList<String> getAllStrings(int length){
    ArrayList<String> prev;
    for(int i=0; i<length; i++){
        ArrayList<String> newL=new ArrayList<String>;
        for(String s:prev){
            newL.add(s+"1");
            newL.add(s+"2");
        }
        prev=newL;
    }
    return prev;
}
于 2013-11-11T00:42:09.333 回答
0

这是获取某个域的所有排列的简单方法,即您可以调用:
permute(3,"12", "");yield:

111 112 121 122 211 212 221 222

public void permute(int length, String domain, String result)
    {
        if (length == 0)
        {
            System.out.println(result);
        }
        else
        {
            for (int i = 0; i < domain.length(); i++)
                permute(length-1, domain, result + domain.charAt(i));
        }
    }
于 2013-11-11T00:45:34.477 回答