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

标签 javascript recursion set

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

  1. 可能值的数组
  2. 整数最大值

我希望我的函数返回一个数组数组,表示可能值的每个可能排列,从大小为 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 的集合。因此返回的结果集是:

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

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

我希望这是有道理的。谁能帮我用 JavaScript 写这个?它必须涉及递归,但我在思考它时陷入困境。

更新:如果您阅读评论,您会发现我在这里描述的并不是技术上的排列。这实际上是一个比排列大得多的集合。但希望我上面的例子能够清楚地说明我在这里的目标。这些也许可以称为重复排列。我认为对于给定的数字应该有 x 的阶乘,但请记住我正在询问 0 到 x 的所有数字。

最佳答案

尝试一下,因为这个问题很有趣..

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);

关于javascript - 如何编写递归函数来获取表示每个值排列集合的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26935407/

相关文章:

javascript - ReactJS - 单击单选按钮时动态更改组件的颜色

javascript - 在 slider 中延迟加载图像(纯 JS)

JavaScript 不工作。显示无法读取属性

javascript - 谷歌地图 API 无法加载 map

haskell - 如何在Haskell中解决 "stack space overflow"

c++ - 递归函数不返回指定值

javascript - AWS lambda : How to Add Numbers to a NS Set in Dynamodb

Java - 使用递归返回列表

快速选择 Set<T> 的随机项目

c# - 如何在 C# 中拥有一组枚举值?