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()
——它接受两个参数:

  • 可能值的数组
  • 最大整数
  • 我希望我的函数返回一个数组数组,表示可能值的每个可能排列,从大小为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的所有数字。

    好吧,我算出来了。下面是我最后做的:

    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最糟糕的情况。因此,非常感谢你在这里的回答。