使用ArrayList在Java中递归生成二进制字符串
我想根据用户输入找到任意大小的2^n排列。我不知道怎么做。我知道我必须使用递归。与我看到的大多数示例不同,函数的参数只是数字输入,没有字符串可以用来进行所有排列。所有排列都将存储在arrayList中并输出给用户。 i、 e(投入3) 输出: 000 001 010 011 100 101 110 111 以下是我目前掌握的代码:使用ArrayList在Java中递归生成二进制字符串,java,algorithm,recursion,arraylist,binary,Java,Algorithm,Recursion,Arraylist,Binary,我想根据用户输入找到任意大小的2^n排列。我不知道怎么做。我知道我必须使用递归。与我看到的大多数示例不同,函数的参数只是数字输入,没有字符串可以用来进行所有排列。所有排列都将存储在arrayList中并输出给用户。 i、 e(投入3) 输出: 000 001 010 011 100 101 110 111 以下是我目前掌握的代码: public static void printBin(int bits) { ArrayList<String> binaryArray = n
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);
}
}
}
publicstaticvoidprintbin(int位){
ArrayList binaryArray=新的ArrayList();
如果(位==0){
System.out.println(二进制数组);
}
否则{
用于(字符串string2:binaryArray){
字符串comp=“”;
如果(comp.length()以n开始,我想要n=3位。主函数调用函数“genBin”,传递一个参数(“0”,n-1)和另一个参数(“1”,n-1)。genBin返回一个列表。主函数将两个列表合并为一个ArrayList
genBin(String-in,int-bitsLeft),如果bitsLeft>0,则使用(“0”+in,bitsLeft-1)和(“1”+in,bitsLeft-1)调用自身,并将两个返回值合并为ArrayList。如果bitsLeft==0,则作为单个元素ArrayList返回
主函数在执行我前面提到的合并后,会得到一个所有排列的合并列表。从n开始。我需要n=3位。主函数调用一个函数“genBin”,传递一个参数(“0”,n-1),另一个参数是(“1”,n-1).genBin返回一个列表。主函数将两个列表合并为一个ArrayList
genBin(String-in,int-bitsLeft),如果bitsLeft>0,则使用(“0”+in,bitsLeft-1)和(“1”+in,bitsLeft-1)调用自身,并将两个返回值合并为ArrayList。如果bitsLeft==0,则作为单个元素ArrayList返回
在执行我前面提到的合并后,您的主要功能将得到一个包含所有排列的合并列表。我认为这是您能做到的最好的方法
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);
}
}
}
我想这是你能做的最好的了
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);
}
}
}
检查此问题的第一个答案:。而不是System.out.println,将其保存到列表中。您不必使用递归,只需在for循环中执行此操作。是否需要禁止当前迭代作为参数?我假设您要做的是将每个数字添加到列表中。如果您无法为要添加的当前数字创建参数ed您必须使用列表大小来确定当前迭代是什么。请注意,值000、001、010、011、100、110和111是数字0..7的二进制值。可以使用这些值。是否有特定的原因让您通过这些卷积来完成此操作?我希望不必使用递归@Radiodef.哈哈,我正试着把我的脑袋放在递归上,这就是“家庭作业”我在书中遇到的问题。我想学习如何做并理解它。无论如何,谢谢。@Evans。你能解释一下如何在不使用字符串参数的情况下完成你建议的答案吗。我不确定如何完全翻转它。谢谢检查这个问题的第一个答案:。而不是System.out.println,将它保存到一个列表中你不知道如果要使用递归,您可以在for循环中执行此操作。是否需要禁止当前迭代作为参数?我假设您要做的是将每个数字添加到列表中。如果无法为要添加的当前数字创建参数,则必须使用列表大小来确定当前迭代是什么。请注意000、001、010、011、100、110和111是数字0..7的二进制值。人们可以用来获取这些值。有什么特别的原因让你要通过这样的卷积来实现这一点吗?我希望我不必使用recursion@Radiodef。哈哈,我正试着围绕递归来思考,这就是“家庭作业”我在书中遇到的问题。我想学习如何做并理解它。无论如何,谢谢。@Evans。你能解释一下如何在不使用字符串参数的情况下完成你建议的答案吗?我不确定如何完全翻转它。谢谢我喜欢你的方法@sdanzig,但我需要在没有字符串参数的情况下完成它,只有整数value和我需要一个ArrayList,而不仅仅是多个字符串的输出。我似乎不知道如何在不使用字符串参数的情况下调整此方法,也许您可以提供一些见解?谢谢。是的,我可以修改此方法以使用int而不是字符串,但我确信Radiodef已经涵盖了它:)我喜欢你的@sdanzig方法,但我需要在没有字符串参数的情况下使用它,只有整数值,我需要一个ArrayList,而不仅仅是多个字符串的输出。我似乎不知道如何在不使用字符串参数的情况下调整此方法,也许你可以提供一些见解?谢谢。是的,我可以修改此方法o使用整数而不是字符串,但我相信Radiodef已经涵盖了这一点:)非常感谢您如此详细地介绍了这一点。您能解释这一行吗:n.append(((list.size()>>I)&1==1)?1:0;谢谢列表大小天生就是下一个要查找的数字。位移位/掩蔽是确定每个位的值的一种方法。我知道你的代码是有效的。我只是想全部理解。:)我添加了一个演示逻辑的演练。如果你不熟悉位移位/位移位的内容,这里是维基百科的文章,解释了它们:哦,还有?:
语法是一种内联if/else,如果这是您以前从未见过的东西。它允许您执行类似于int n=1;String s=n==1?“1”:“0”
的操作,它相当于int n=1;String s;if(n==1){s=“1”}else{s=“0”}
。非常感谢您如此详细地说明这一点。您能解释这一行吗:n.append(((list.size()>>i)&1==1)?1:0;感谢列表大小天生就是下一个要查找的数字。位移位/屏蔽是确定每个位的值的一种方法。我知道