java - 使用 ArrayList 在 Java 中递归生成二进制字符串

标签 java algorithm recursion arraylist binary

我想根据用户输入找到任意大小的 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/

相关文章:

java - 部署 Grails 应用程序时出错 - 初学者

algorithm - 模式识别算法/技术

javascript - 如何在 ES6 Promise 中使用递归?

python - 从边缘列表构建所有哈密顿路径

java - 有没有办法在 JAXP 或 Xalan XSLT 范围内绑定(bind) Java 对象?

Java 文件替换行

python - 提取嵌套括号内的字符串

recursion - Prop 中的 Bove-Capretta 谓词

java - Grails 2.0.4 打开 zip 文件时出错或缺少 Springloaded 的 JAR list

ruby - 寻找下一个最大的整数