【问题标题】:Recursively Generating Binary Strings in Java using ArrayList使用 ArrayList 在 Java 中递归生成二进制字符串
【发布时间】:2013-11-06 16:25:57
【问题描述】:

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


    }
}

提前致谢。

【问题讨论】:

  • 查看此问题的第一个答案:stackoverflow.com/questions/8461438/…。而不是 System.out.println,将其保存到列表中
  • 您不必使用递归,您可以在 for 循环中执行此操作。是否需要将当前迭代作为参数?我假设您正在做的是将每个数字添加到列表中。如果您无法为要添加的当前数字创建参数,则必须使用列表大小来找出当前迭代是什么。
  • 请注意,值 000、001、010、011、100、110 和 111 是数字 0 .. 7 的二进制值。可以使用 Integer.toBinaryString(int i) 来获取值。您是否有特殊原因要通过此类卷积来执行此操作?
  • 我希望我不必使用递归@Radiodef。哈哈,我正试图将我的头脑围绕在递归上,这是我所拥有的书中给出的“家庭作业”问题。我想学习如何去做并理解它。还是谢谢。
  • @埃文斯。您能否解释如何在不使用字符串参数的情况下执行您建议的答案。我不确定如何完全翻转它。谢谢

标签: java algorithm recursion arraylist binary


【解决方案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

【讨论】:

  • 非常感谢您详细说明这一点。你能解释一下这一行吗: n.append(((list.size() >> i) & 1 == 1) ? 1 : 0);谢谢
  • 列表大小天生就是下一个要查找的数字。位移/掩码是一种确定每个位值的方法。
  • 我知道您的代码有效。我只是想了解这一切。 :)
  • 我添加了一个演示逻辑的演练。如果您不熟悉按位/位移的内容,请参阅解释它们的维基百科文章:en.wikipedia.org/wiki/Bitwise_operation#AND
  • 哦,? : 语法是一个内联的 if/else 如果这是你以前没见过的。它可以让你执行类似int n = 1; String s = n == 1 ? "1" : "0"; 的操作,相当于int n = 1; String s; if (n == 1) { s = "1"; } else { s = "0"; }
【解决方案2】:

你从 n.. 开始。我想要 n=3 位。您的主函数调用一个函数“genBin”,传递一个参数(“0”,n-1)和另一个参数(“1”,n-1)。 genBin 返回一个列表。 main函数将两个列表合并为一个ArrayList。

genBin(String in, int bitsLeft),如果 bitsLeft > 0,用 ("0"+in,bitsLeft-1) 和 ("1"+in,bitsLeft-1) 调用自身,并将两个返回值合并为一个数组列表。如果 bitsLeft == 0,则作为单个元素 ArrayList 返回。

在执行我之前提到的合并后,您的主要功能最终会得到所有排列的合并列表。

【讨论】:

  • 我喜欢你的方法@sdanzig,但我需要在没有字符串参数的情况下这样做,只有整数值,我需要一个 ArrayList 而不是多个字符串的输出。我似乎无法弄清楚如何在不使用 String 参数的情况下将此方法调整为工作,也许您可​​以有所了解?谢谢。
  • 是的,我可以修改它以使用整数而不是字符串,但我确信 Radiodef 已经涵盖了它:)
猜你喜欢
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 2019-09-02
  • 2014-08-10
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多