这是主题:
我有一个LinkedList list
,如果列表有3个元素,我想列出一个完整的真值表,例如:
a b c <--- the three elements in list
0 0 0
0 0 1
0 1 0
1 0 0
1 1 1
1 1 0
1 0 1
0 1 1
如果列表有4个或更多元素,我想生成一个更大的表。
但我被困在这里:
我知道写这样的循环可以生成整个表:
for (int a = 0; a < 2; a++){
for (int b = 0; b < 2; b++) {
for (int c = 0; c < 2; c++) {
for (int d = 0; d < 2; d++) {
System.out.println(a + " " + b + " " + c + " " + d);
}
}
}
}
但是我无法根据列表大小更改循环次数,我认为为此编写特殊情况是不可接受的,有没有其他方法可以做到这一点?
答案 0 :(得分:12)
简单的解决方案:
代码:
int len = 3;
int num = (int)Math.pow(2, len);
for(int i=0; i<num; i++){
// http://stackoverflow.com/a/4421438/1273830
System.out.println(String.format("%"+len+"s", Integer.toBinaryString(i)).replace(' ', '0'));
}
基本数字逻辑:真值表是二进制数字序列。
答案 1 :(得分:1)
循环次数需要与元素数量相匹配。有两种方法可以解决这个问题。
答案 2 :(得分:0)
我不会为你写Java,但这里有一个伪代码,让你知道如何递归地解决问题:
l = ['a','b','c']
def f(l, result):
if len(l) == 0:
print result
return
first = l[0]
rest = l[1:]
f(rest, result + [(first,0)])
f(rest, result + [(first,1)])
f (l, [])
这应该打印如下:
[('a', 0), ('b', 0), ('c', 0)]
[('a', 0), ('b', 0), ('c', 1)]
[('a', 0), ('b', 1), ('c', 0)]
[('a', 0), ('b', 1), ('c', 1)]
[('a', 1), ('b', 0), ('c', 0)]
[('a', 1), ('b', 0), ('c', 1)]
[('a', 1), ('b', 1), ('c', 0)]
[('a', 1), ('b', 1), ('c', 1)]