如何在Java中创建一个程序来获取给定位数的1和2的所有组合

如何在Java中创建一个程序来获取给定位数的1和2的所有组合,java,algorithm,Java,Algorithm,假设n=7,那么我需要显示由1和2组成的7位数字的所有可能组合: 1111111 1111112 1111121 1111211 1112111 ....... 2222222 这是我的代码,但它是硬编码嵌套7次循环。所以我的计数=128,也就是2^7,但是如何以编程的方式进行n次嵌套呢?我认为它需要一些递归,但是怎么做呢 int count = 0; for (int j = 1; j<=2; j++) { for (int z= 1; z<=2; z++)

假设n=7,那么我需要显示由1和2组成的7位数字的所有可能组合: 1111111 1111112 1111121 1111211 1112111 ....... 2222222 这是我的代码,但它是硬编码嵌套7次循环。所以我的计数=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+",");

                            }
                        }
                    }       
                }
            }
        }
    }
int count=0;

对于(int j=1;j使用递归。您应该计划传入部分构建的字符串和剩余的位数。我将在这里连接字符串,尽管通常应该使用StringBuilder

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;
}
publicstaticarraylistgetallstrings(int-length){
ArrayList prev;
对于(int i=0;i通常,“N个符号的所有组合”与“以N为基数计数”相同

因为您有两个符号,所以更简单。从0到
X
计数,获取每个数字的二进制表示形式,将
0
替换为
2
。一旦二进制表示形式超过所需的值数,请停止


不要忘了给太短的数字加上前导的
2

这里有一个简单的方法来获取某个域的所有排列,即你可以调用:
permute(3,“12”和“);
产生:

111 112 121 122 211 212 221 222

public void排列(整数长度、字符串域、字符串结果)
{
如果(长度==0)
{
系统输出打印项次(结果);
}
其他的
{
for(int i=0;i
我非常喜欢模糊版本……;-):

final int l=7;
长m=1=0){
int b=l;
而(--b>=0){
系统输出打印((m>>b)和1)+1);
}
System.out.println();
}
}

编辑:
我应该对以上内容进行说明。。。。我所做的就是从
2^7-1
开始倒计时,然后打印每个值中设置的位(打印
2
表示位值1,打印
1
表示位值0)

你需要的是回溯巢母…我想建议一个基本变量和一个数字数组,用
next
函数递增,但这要简单得多:我不得不承认它既脏又慢,尽管。。。适合初学者练习,但不会将其放入生产代码中。rolfl的答案是我的算法的“精炼”版本(使用二进制表达式而不是字符串表示进行操作)。我也更喜欢它。第一个例子行得通,但第二个不行。还是非常感谢。@user2977438不知道你说的是什么意思。如果您永远不想使用不同的域,那么您可以将其作为参数之一取出,并在函数中简单地声明它。您可以很容易地将其转换为两个方法,一个可以由用户以最少的输入调用,该用户可以调用此方法。很容易修改。。。
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));
        }
    }
    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();
    }
}