4

件名は次のとおりです。

リストに3つの要素があるLinkedList list場合、その真理値表全体をリストしたいと思います。たとえば、次のようになります。

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);
                    }
                }
            }
        }

しかし、リストのサイズに基づいてループの数を変更することはできません。また、このための特別なケースを作成することは受け入れられないと思います。そのため、これを行う別の方法はありますか?

4

3 に答える 3

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'));
}

基本的なデジタルロジック:真理値表は2進数のシーケンスです。

于 2012-09-13T10:11:28.643 に答える
1

ループの数は、要素の数と一致する必要があります。これを解決するには2つの方法があります。

  • 再帰を使用して、ループが1つあり、メソッドが次のレベルのループを呼び出すようにします。
  • 2 ^ n回繰り返され、コンポーネント値を抽出する単一のループを使用します。
于 2012-09-13T10:08:41.670 に答える
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)]
于 2012-09-13T10:17:47.513 に答える