我想根据用户输入找到任意大小的 2^n 排列。我不知道该怎么做。我知道我必须使用递归。与我见过的大多数例子不同,该函数的参数只是输入的数字,没有可用于进行所有排列的字符串。所有排列都将存储在 arrayList 中并输出给用户。 即(输入 3) 输出: 000 001 010 011 100 101 110 111 这是我到目前为止的代码:
public static void printBin(int bits) {
ArrayList<String> binaryArray = new ArrayList<String>();
if(bits == 0) {
System.out.println(binaryArray);
}
else {
for (String string2 : binaryArray) {
String comp = "";
if (comp.length() <= string2.length()) {
comp = string2;
string = comp;
}
string.concat("0");
binaryArray.add(string);
printBin(bits - 1);
string.concat("1");
binaryArray.add(string);
printBin(bits-1);
}
}
}
提前致谢。
最佳答案
好吧,这是我认为你能做的最好的。
import java.util.ArrayList;
public class BinaryList {
public static void main(String[] args) {
try {
if (args.length != 1 || Integer.parseInt(args[0]) < 1)) {
System.err.println("Invalid integer argument");
return;
}
binaryRecursive(Integer.parseInt(args[0]), new ArrayList<String>(0));
} catch (NumberFormatException e) {
System.err.println("Argument not an integer");
}
}
public static void binaryRecursive(int bits, ArrayList<String> list) {
if (list.size() == (int)Math.pow(2, bits)) {
for (String n : list) {
System.out.println(n);
}
} else {
StringBuilder n = new StringBuilder(bits);
for (int i = bits - 1; i >= 0; i--) {
n.append((list.size() >> i) & 1);
}
list.add(n.toString());
binaryRecursive(bits, list);
}
}
}
如果不将最后一个作为参数传递、返回值或将列表保留为字段,则无法保留它们的列表。
按照 bits == 2 的逻辑,你得到的是:
* 1st method call
list.size() == 0
for 1 to 0 {
(00 >> 1 = 00) & 01 == 0
(00 >> 0 = 00) & 01 == 0
}
list.add("00")
* 2nd method call
list.size() == 1
for 1 to 0 {
(01 >> 1 = 00) & 01 == 0
(01 >> 0 = 01) & 01 == 1
}
list.add("01")
* 3rd method call
list.size() == 2
for 1 to 0 {
(10 >> 1 = 01) & 01 == 1
(10 >> 0 = 10) & 01 == 0
}
list.add("10")
* 4th method call
list.size() == 3
for 1 to 0 {
(11 >> 1 = 01) & 01 == 1
(11 >> 0 = 11) & 01 == 1
}
list.add("11")
* 5th method call
list.size() == 4 == 2 ^ 2
print the list
关于java - 使用 ArrayList 在 Java 中递归生成二进制字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19625637/