是的,工作正常。如果你想枚舉所有的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));
}
笑你能不能把這一對僞碼 – Aly 2010-03-05 14:33:17
你並不真的需要遞歸。你可以在0開始每個循環,並跳過任何一張牌匹配的情況。儘管如此,遞歸更好。 – kgrad 2010-03-05 14:40:09