尝试从ActionScript中的Array获取k子集时得到错误的答案

时间:2014-06-11 19:06:23

标签: algorithm actionscript-3 flash recursion actionscript

我正在开发德州扑克游戏,我需要从一组卡片中生成所有可能的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的数组Array。然而,一旦我测试了函数,我得到的数组只包含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

当然它应该打印一个包含之前列出的所有组合的数组,但它只会打印最后一次合适的次数。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

错误的原因在于,在创建数组数组时,实际上是使用相同数组(数据)的引用,因此在执行最后一个组合时,数据数组的包含变为3,4,5索引resultArray指向数据数组,因此它打印出相同的值。

解决方案: -

if (index == r) {
            trace(resultIndex, data);
            var result = new Array();
            copy(result,data)
            resultArray[resultIndex] = result;
            return ++resultIndex;
}

注意: -

以上是伪代码,因为我不熟悉actionscript,但你可以实现复制功能,将数据值复制到actionscript语法中。