我想通过递归来解决问题。我有一个给定的字母列表,我希望得到这些字母的所有排列,直到达到给定的长度。
var letters= ["A", "B", "C", "D", "E", "F"];
function myRekursion(alphabet, n){
if(n > 0){
for(var i = 0; i < letters.length; i++){
document.write(letters[i]);
myRekursion(letters, n - 1);
}
document.write(",<br>");
}
}
myRekursion(letters,3);
我无法弄清楚为什么我会一直浏览完整列表,而不是创建如下列表:AAA,AAB,AAC,...,FFF
你有解决方案吗?
答案 0 :(得分:1)
这称为cartesian product
。
您可以使用ES6功能来实现此目的:reduce
和map
方法。
在集合论中(通常,在数学的其他部分),a 笛卡尔积是一种数学运算,它返回一组 多套。
function cartesianProduct(array ,n) {
arrayToWork = [];
for(i = 0;i < n;i++)
arrayToWork.push(array);
return arrayToWork.reduce((a, b) =>
a.map(x => b.map(y => x.concat(y)))
.reduce((a, b) => a.concat(b), []), [[]]);
}
console.log(cartesianProduct(['A','B','C','D','E','F'],3));
&#13;
答案 1 :(得分:0)
您的循环条件为i < letters.length
,您可能需要i < alphabet.length
或i < n
。
编辑:这个问题似乎更为根本。递归地这样做是很难的,因为你不能在每一步写一封信,因为每一个叶子都是如此。递归树的名称要求写入该字母。相反,您可以添加数组chosen
作为函数参数,其中包含到目前为止所选择的字母。然后,在n===0
,您可以打印所选的字母。
例如:
var letters= ["A", "B", "C", "D", "E", "F"];
function myRekursion(alphabet, n, chosen){
if(n > 0){
for(var i = 0; i < alphabet.length; i++){
var newChosen = chosen.slice(); //this copies the array
newChosen.push(alphabet[i]);
myRekursion(alphabet, n - 1, newChosen);
}
} else {
for(var i = 0; i < chosen.length; i++) {
document.write(chosen[i]);
}
document.write(',<br />');
}
}
myRekursion(letters, 3, []);
&#13;
答案 2 :(得分:0)
您正在寻找combinations with repetition。
您可以通过为先前收集的值获取临时数组来采取递归方法,并根据所需长度检查此数组。如果您获得了元素数量,则显示实际数组并保留重复。
如果没有迭代给定数组的元素并将实际元素连接到临时数组并再次调用该函数。
function getCombinations(array, n) {
function iter(temp) {
var i;
if (temp.length === n) {
result.push(temp.join(''));
return;
}
for (i = 0; i < array.length; i++) {
iter(temp.concat(array[i]));
}
}
var result = [];
iter([]);
return result;
}
console.log(getCombinations(["A", "B", "C", "D", "E", "F"], 3));
.as-console-wrapper { max-height: 100% !important; top: 0; }