我坚持如何开始编码。
我希望能够做到以下几点。这是经典翻转硬币问题
如果我翻了两次,那就是:
T T
T F
F T
F F
我希望能够一次创建一个包含一个结果的数组。为了更好地说明这一点,它应该是(顺便说一下我使用Java):
boolean [] cases = new boolean [numberOfFlips]
第一次案件将有:T T.
在我完成了对此结果的其他计算之后,我想继续前进并制作案例:T F并继续运行其他计算。
有人可以指导我正确的方向吗?我将不胜感激。
任何语言的算法都适合我。感谢您的时间! (:
答案 0 :(得分:4)
有许多方法可以在Java中存储二进制数据,目前还不清楚,您想要存储什么。如果您想存储N
翻转的所有可能组合,那么您需要和数组new boolean[2^N][N]
请记住,Java有另一种提升权力的语法。
<强>更新强>
以下是存储N
翻转的所有组合的代码。
通过它,您将了解如何生成一个组合:从组合序号的二进制表示。见评论。
// number of flips
// limit it by 31
int N = 3;
// number of combinations
// using bitshift to power 2
int NN = 1<<N;
// array to store combinations
boolean flips[][] = new boolean[NN][N];
// generating an array
// enumerating combinations
for(int nn=0; nn<NN; ++nn) {
// enumerating flips
for( int n=0; n<N; ++n) {
// using the fact that binary nn number representation
// is what we need
// using bitwise functions to get appropriate bit
// and converting it to boolean with ==
flips[nn][N-n-1] = (((nn>>n) & 1)==1);
// this is simpler bu reversed
//flips[nn][n] = (((nn>>n) & 1)==1);
}
}
// printing an array
for(int nn=0; nn<NN; ++nn) {
System.out.print("" + nn + ": ");
for( int n=0; n<N; ++n) {
System.out.print(flips[nn][n]?"T ":"F ");
}
System.out.println("");
}
答案 1 :(得分:1)
注意所需输出与整数的二进制表示之间的相似性。这是一个例子:
for(int i = 0; i < 4; ++i) {
boolean first = (i & 1) == 0;
boolean second = (i & 2) == 0;
System.out.println(first + "\t" + second);
}
打印:
true true
false true
true false
false false
答案 2 :(得分:1)
这是一个适用于任意数量翻转的一般解决方案(在合理范围内):
public class Flips {
static void generate(boolean[] res, int start) {
if (start == res.length) {
System.out.println(Arrays.toString(res));
} else {
generate(res, start + 1);
res[start] = true;
generate(res, start + 1);
res[start] = false;
}
}
static void generate(int n) {
boolean res[] = new boolean[n];
generate(res, 0);
}
public static void main(String args[]) {
generate(4);
}
}
它会以与您问题中的顺序不同的顺序生成组合,但如果重要的话,修改以匹配您的订单是微不足道的。
答案 3 :(得分:1)
使用递归:
public static void main(String args[]) {
int size = 3;
generateTable(0, size, new int[size]);
}
private static void generateTable(int index, int size, int[] current) {
if(index == size) {
for(int i = 0; i < size; i++) {
System.out.print(current[i] + " ");
}
System.out.println();
} else {
for(int i = 0; i < 2; i++) {
current[index] = i;
generateTable(index + 1, size, current);
}
}
}