如何动态决定我想要多少个循环?

时间:2012-09-13 10:05:59

标签: java for-loop

这是主题:

我有一个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);
                    }
                }
            }
        }

但是我无法根据列表大小更改循环次数,我认为为此编写特殊情况是不可接受的,有没有其他方法可以做到这一点?

3 个答案:

答案 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 ^ n次并提取组件值。

答案 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)]