從 N 個元素中取出 C 個的所有組合,採用迭代+回溯避免遞迴堆疊溢位,適合大規模枚舉。
private function compound(N:uint, C:uint):void {
var pickIndex:int = 0;
var arr:Array = [];
var src:Array = [];
for (var i:int = 0; i < N; i++) src.push(i + 1);
while (true) {
if (pickIndex < N) {
arr.push(src[pickIndex++]);
if (arr.length == C) {
// 輸出當前組合
var tmp:String = "";
for (i = 0; i < C; i++) tmp += arr[i] + " ";
trace(tmp);
// 回溯尋找下一個組合起點
if (pickIndex == N) {
var backto:int = -1;
for (i = C - 1; i > 0; i--) {
if (arr[i] - arr[i-1] > 1) {
backto = i - 1;
break;
}
}
if (backto == -1) break; // 全部枚舉完成
pickIndex = arr[backto];
for (i = 0; i < C - backto; i++) arr.pop();
} else {
arr.pop(); // 繼續嘗試下一個元素
}
}
} else {
break;
}
}
}
pickIndex 向前掃描,將元素加入 arrarr.length == C 時輸出一組合backtopickIndex 設為該位置值,彈出後續元素,繼續前進backto == -1)表示已枚舉完畢作者:aerror