我正在制作一款德州扑克游戏,我需要从纸牌数组中生成所有可能的k个子集(在本例中以数字表示)。这是到目前为止的样子:
public function getKSubsetsFromArray(arr:Array, k:int):Array {
var data:Array = new Array();
var result:Array = new Array();
combinations(arr, data, 0, arr.length - 1, 0, k, result, 0);
return result;
}
public function combinations(arr:Array, data:Array, start:int, end:int, index:int, r:int, resultArray:Array, resultIndex:int):int {
if (index == r) {
trace(resultIndex, data);
resultArray[resultIndex] = data;
return ++resultIndex;
}
for (var i:int = start; i<=end && end-i+1 >= r-index; i++) {
data[index] = arr[i];
resultIndex = combinations(arr, data, i + 1, end, index + 1, r, resultArray, resultIndex);
}
return resultIndex;
}
我是新的Actionscript,我的想法是有一个函数,它需要一个数组的数字和参数k,并返回数组的每个大小k的数组。然而,一旦我测试的函数,我得到一个数组只包含最后的组合nCk次。例如:
var testArray:Array = new Array(1, 2, 3, 4, 5);
trace(getKSubsetsFromArray(testArray, 3));
的回报:
0 1,2,3
1 1,2,4
2 1,2,5
3 1,3,4
4 1,3,5
5 1,4,5
6 2,3,4
7 2,3,5
8 2,4,5
9 3,4,5
函数输出为
3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5,3,4,5
当然,它应该打印一个包含前面列出的所有组合的数组,但它只打印最后一个组合的正确次数。
谢谢你的帮助。
错误的原因是当你制作数组的数组时,你实际上使用了相同数组(数据)的引用,所以当最后一次组合执行时,数据数组的包含成为3,4,5
, resultArray
的每个索引指向数据数组,因此它打印出相同的值。
解决方案:-
if (index == r) {
trace(resultIndex, data);
var result = new Array();
copy(result,data)
resultArray[resultIndex] = result;
return ++resultIndex;
}
注意:-
以上是伪代码,因为我不熟悉actionscript,但你可以实现复制函数,复制数据值到结果在actionscript语法