Javascript 如何编写递归函数来获取表示每个值排列的数组?
我想编写一个函数——调用它Javascript 如何编写递归函数来获取表示每个值排列的数组?,javascript,recursion,set,Javascript,Recursion,Set,我想编写一个函数——调用它setGenerator()——它接受两个参数: 可能值的数组 最大整数 我希望我的函数返回一个数组数组,表示可能值的每个可能排列,从大小为0的集合到指定最大值的集合 所以不管怎样,这个函数至少会返回一个包含空数组的数组。但这里有一个简单的例子来说明我想做什么: setGenerator(["A", "B", "C"], 2); // should return: // [ [], ["A"], ["B"], ["C"], ["A", "A"], ["A", "B"],
setGenerator()
——它接受两个参数:
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]等
更新:如果你阅读了评论,你会发现我在这里描述的不是技术上的排列。这实际上是一个比排列更大的集合。但希望我在这里射击的目标能通过我上面的例子明确。这些可能被称为重复排列。我认为对于一个给定的数字应该有x个阶乘,但请记住,我问的是从0到x的所有数字。好吧,我算出来了。下面是我最后做的:
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);
});
}
}
函数addPermutationswithRepeation(aFinalSet、AALOWED、iLength、aTemp){
如果(aTemp的类型!=“对象”){
aTemp=[];
}
如果(aTemp.length>=ILENGHT){
aFinalSet.push(aTemp);
}否则{
对于(var j=0;j
那么我只需要这样做:
var aFinalSet = [];
for (var i = 0; i < iMaximum; i++) {
addPermutationsWithRepetition(aFinalSet, aAllowed, i);
}
var aFinalSet=[];
对于(变量i=0;i
尝试了一下,因为问题很有趣
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);
var结果=[];
var setGenerator=函数(值、最大值、前缀){
前缀=前缀类型!=“未定义”?前缀:[];
结果:推送(前缀);
对于(var i=0;我不是来做你的家庭作业的。你尝试了什么。这不是家庭作业……我已经离开学校10年了,所以有点生疏了!:)为什么[“a”,“a”,“B”,“B”,“B”,“C”,“C”]是排列?你是什么意思?为什么?它们是!键入:[javascript][排列]
进入搜索框。哇,与我提出的方法相比,我更喜欢这种方法。最重要的是,我喜欢你发现这个问题很有趣并尝试了一个解决方案。对我来说,这代表了StackOverflow的最佳精神。相比之下,快速发表无用评论的人喜欢“我们不是来做你的家庭作业”代表了StackOverflow最糟糕的情况。因此,非常感谢你在这里的回答。