如何编写递归函数来获取表示每个值排列集的数组?

时间:2014-11-14 17:16:07

标签: javascript recursion set

我想编写一个函数 - 称之为setGenerator() - 它接受两个参数:

  1. 可能值的数组
  2. 最大整数
  3. 我希望我的函数返回一个数组数组,表示可能值的每个可能的排列,从大小为0的集合到指定的最大值集合。

    所以无论如何,这个函数总是至少返回一个包含空数组的数组。但这里有一个简单的例子来说明我正在尝试做什么:

    setGenerator(["A", "B", "C"], 2);
    // should return:
    // [ [], ["A"], ["B"], ["C"], ["A", "A"], ["A", "B"], ["A", "C"], 
    // ["B", "A"], ["B", "B"], ["B", "C"], ["C", "A"], ["C", "B"], ["C", "C"] ]
    

    在我的示例中查看输入和输出。输入说我的可能值是字符串A,B和C,我应该形成大小为0到2的集合。因此返回的结果集是:

    • 一组大小为零[]
    • 每个可能值的大小一:[A],[B],[C]
    • 每个排列的大小为2的集合:[A,A],[A,B],[A,C],[B,A]等。

    如果我将最大值设置为3,那么该函数也应该返回长度为3的所有排列集。

    我希望这是有道理的。任何人都可以帮我用JavaScript写这个吗?它必须涉及递归,但在考虑它时我会陷入困境。

    更新:如果您阅读了评论,您会看到我在这里描述的内容并非技术上的排列。这实际上是一个比排列更大的集合。但是希望我在这里拍摄的目标能够通过上面的例子清楚地表明。这些可以称为重复排列。我认为对于给定的数字,它们应该有x因子,但请记住,我要求所有数字0到x。

2 个答案:

答案 0 :(得分:1)

试一试,因为这个问题很有意思。

var results = [];

var setGenerator = function(values,max,prefix){
    prefix = typeof prefix !== 'undefined' ? prefix : []; 
    results.push(prefix);
    for (var i = 0; i<values.length; i++){
        var newPrefix = prefix.slice(0);
        newPrefix.push(values[i]);
        if (newPrefix.length <= max)
            setGenerator(values, max, newPrefix);
    }   
};

setGenerator(["A","B","C"],2);
console.log(results);

答案 1 :(得分:0)

好吧,我明白了。这就是我最终做的事情:

function addPermutationsWithRepetition(aFinalSet, aAllowed, iLength, aTemp) {
    if (typeof aTemp != 'object') {
        aTemp = [];
    }
    if ( aTemp.length >= iLength ) {
        aFinalSet.push(aTemp);
    } else {
        for (var j = 0; j < aAllowed.length; j++) {
            var aTemp2 = JSON.parse(JSON.stringify(aTemp));
            aTemp2.push(aAllowed[j]);
            addPermutationsWithRepetition(aFinalSet, aAllowed, iLength, aTemp2);
        });
    }
}

然后我必须这样做:

var aFinalSet = [];
for (var i = 0; i < iMaximum; i++) {
    addPermutationsWithRepetition(aFinalSet, aAllowed, i);
}