2012-09-13 46 views
4

這裏是主題:如何動態決定我想要多少個循環?

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

而是基於列表的大小我不能改變的迴路數,我認爲爲此寫特例是不可接受的,那麼是否有另一種方法可以做到這一點?

+2

聽起來像遞歸可能是有用的。 – 2012-09-13 10:07:57

+0

曾閱讀過一些,爲什麼要問?@ZagorulkinDmitry – shengy

回答

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

基本數字邏輯:真值表是二進制數字序列。

+0

感謝您的基本邏輯提示! – shengy

1

循環的數量需要與元素的數量相匹配。有兩種方法可以解決這個問題。

  • 使用遞歸,以便有一個循環,並且該方法爲下一級循環調用自身。
  • 使用重複2^n次的單個循環並提取出組件值。
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)] 
+0

所以你發佈_untested_非java解決方案。爲什麼你首先發布這個?你應該至少發佈更像Java的僞代碼。 (切片在java中不會退出) –

+0

好吧,shengy似乎很難找到一個算法來解決這個問題,所以我提出了一個算法,將Java實現留給了他,因爲我認爲這對他的教育更爲有利。 – piokuc

+0

順便說一句,它被測試 – piokuc