如果我们有一个由4个布尔值组成的数组,那么生成所有可能值的最佳方法是什么?
我想找到一个解决方案,以正确的顺序生成从0“ False”到4“ False”的所有可能性(首先所有可能性为0“ False”,然后所有可能性为1“ False”,然后用2个“ False”等所有可能性,等等):
我正在尝试递归操作,但是我缺少了一些东西。
答案 0 :(得分:1)
好的,想象一个方法:
void addPossible(ArrayList<String> array, String prefix, int numberOfSlots, int numberFalse) {
}
想象一下此方法被称为addPossible(array,“ TTT”,1,0)。在这种情况下,您知道可以有1个正确选择,没有错误选择,因此您可以在数组中仅添加一个值,即前缀+“ T”,或者在这种情况下为“ TTTT”并返回。
现在,多次调用此方法:
for (int index = 0; index < 4; ++index) {
addPossible(array, "", 4, index);
}
换句话说,我们称其为4个插槽,一次为0,然后为1,以此类推。
在方法内部,您将再次调用该方法两次。我不会向您展示所有代码,但是调用将是:
addPossible(array, prefix + "T", numberOfSlots-1, numberFalse);
addPossible(array, prefix + "F", numberOfSlots-1, numberFalse-1);
第一种情况是因为我们要添加一个T,所以我们仍然需要所有的错误。第二种情况是因为我们要添加一个F,所以我们需要少一个false。无论哪种情况,我们都已添加到字符串中,因此剩余的插槽数较小。
还有更多要编写的代码。您实际上并没有将任何内容推入向量,也没有完成逻辑。
但是也许您知道这是如何实现的。
答案 1 :(得分:1)
您可以使用最多2 4 的数字以及相应计数器的位。 该顺序有些棘手,原则上您可以使用BitSet来保存布尔值:
for (int i = 0; i < 1 << 4; ++i) {
BitSet bits = BitSet.valueOf(new long[] { (long)i);
for (int j = 0; j < 4; ++j) {
if (bits.get(j)) {
}
}
}
顺序似乎是i从15下降到0,j从3下降到0。
答案 2 :(得分:0)
public static void main(String[] args) {
final int n = 4;
for (int i = 0; i < Math.pow(2, n); i++) {
String binary = Integer.toBinaryString(i);
while (binary.length() < n)
binary= "0" + binary;
System.out.println(binary);
}
}
输出将是这样
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
您可以将“ 0”视为“ F”,将“ 1”视为“ T”
答案 3 :(得分:0)
最直接的方法是将这些值简单地转换为二进制字符串,在左侧填充缺失的“ 0”字符,然后进行一对一替换。
for (int v : n) {
String s = "000" + Integer.toBinaryString(v);
s = s.substring(s.length() - 4, s.length()).replace("1", "T ").replace(
"0", "F ");
System.out.println(s);
}