我想编写一个函数 - 称之为setGenerator()
- 它接受两个参数:
我希望我的函数返回一个数组数组,表示可能值的每个可能的排列,从大小为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的集合。因此返回的结果集是:
如果我将最大值设置为3,那么该函数也应该返回长度为3的所有排列集。
我希望这是有道理的。任何人都可以帮我用JavaScript写这个吗?它必须涉及递归,但在考虑它时我会陷入困境。
更新:如果您阅读了评论,您会看到我在这里描述的内容并非技术上的排列。这实际上是一个比排列更大的集合。但是希望我在这里拍摄的目标能够通过上面的例子清楚地表明。这些可以称为重复排列。我认为对于给定的数字,它们应该有x因子,但请记住,我要求所有数字0到x。
答案 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);
}