我想编写一个函数 - 称之为 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 的集合。因此返回的结果集是:
- 一套尺寸为零的[]
- 每个可能值的大小为 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/