2010-03-05 54 views
2

我剛剛有一個腦袋,我有一個Deck對象,並且想要以迭代的方式從它得到每5張牌的組合。有人可以告訴我怎麼做,我會想象它會是:枚舉每五張牌組合

for(int i =0; i <52; i++){ 
    for(int j = i + 1 ; j < 52; j++){ 
     for(int k = j + 1; k < 52; k++{ 
      for(int l = k + 1; l < 52; l++){ 
       for(int m = l + 1; m < 52; m++){ 
       } 
      } 
     } 
    } 
    } 

這是正確的嗎?

謝謝

回答

5

是的,工作正常。如果你想枚舉所有的n卡組合,這是行不通的。

爲此,您需要遞歸。將卡0放入插槽0.遞歸枚舉剩下的n-1個插槽中的所有n-1張卡(不包括0)。重複,在插槽0卡1。很容易。

編輯:一些代碼:

private static final int NUM_CARDS = 52; 

public static void main(String[] args) { 
    enumerateAllHands(Integer.parseInt(args[0])); 
} 

private static void enumerateAllHands(int n) { 
    if (n > NUM_CARDS) { 
    throw new IllegalArgumentException(); 
    } 
    int[] cards = new int[n]; 
    BitSet cardsUsed = new BitSet(); 
    enumerate(cards, 0, cardsUsed); 
} 

private static void enumerate(int[] cards, int from, BitSet cardsUsed) { 
    if (from == cards.length) { 
    emit(cards); 
    } else { 
    for (int i = 0; i < NUM_CARDS; i++) { 
     if (!cardsUsed.get(i)) { 
     cards[from] = i; 
     cardsUsed.set(i); 
     enumerate(cards, from + 1, cardsUsed); 
     cardsUsed.clear(i); 
     } 
    } 
    } 
} 

private static void emit(int[] cards) { 
    System.out.println(Arrays.toString(cards)); 
} 
+1

笑你能不能把這一對僞碼 – Aly 2010-03-05 14:33:17

+2

你並不真的需要遞歸。你可以在0開始每個循環,並跳過任何一張牌匹配的情況。儘管如此,遞歸更好。 – kgrad 2010-03-05 14:40:09