通过单个数组递归记录javascript中所有可能的排列

Recurse through single array logging all possible permutations in javascript

本文关键字:有可能 排列 javascript 记录 单个 数组 递归      更新时间:2023-09-26

例如,我有一个数组

["red", "green", "blue", "purple"]

数组中可以有任意数量的条目。使用这个数组,我想创建一个可能排列的列表,但不重复数组中的项目(无重复)

例如,上面的数组将产生

red,green,blue,purple
red,green,purple,blue
red,blue,green,purple
red,blue,purple,green
red,purple,blue,green
red,purple,green,blue
green,red,blue,purple
green,red,purple,blue
green,blue,red,purple
green,blue,purple,red
green,purple,blue,red
green,purple,red,blue
blue,red,green,purple
blue,red,purple,green
blue,green,red,purple
blue,green,purple,red
blue,purple,green,red
blue,purple,red,green
purple,red,green,blue
purple,red,purple,blue
purple,green,red,blue
purple,green,blue,red
purple,blue,green,red
purple,blue,red,green

我是一个递归新手,我还没有完全掌握如何用它来完成这个,

EDIT答案最初提到"组合",但OP寻找的技术术语是"排列";查看下面OP的评论,并了解更多关于组合、排列和变化的信息,在这里(至少有一个区别:在排列中,顺序很重要,在组合中,顺序不重要)

function combs(arr,str){
  var arrCopy,popped;
  for(var i =0; i<arr.length; i++){
     arrCopy = arr.splice(0);
     popped = arrCopy.splice(i,1)
     combs(arrCopy,popped);
  }
  if(arr.length === 0){
    console.log(str);
  }
}

将所有选项记录到控制台。如果您需要以某种格式返回它们,您可以返回而不是在基本情况下打印,并在必要时将递归调用的结果连接在一起。

function allcombs(a) {
  var all = [];
  function combs(arr, str) {
    var arrCopy, popped;
    for (var i = 0; i < arr.length; i++) {
      arrCopy = arr.splice(0);
      popped = arrCopy.splice(i, 1)
      combs(arrCopy, popped);
    }
    if (arr.length === 0) {
      all.push(str);
      console.log(str);
    }
  }
  combs(a);
  return all;
}

你可以这样开始:

http://rosettacode.org/wiki/Permutations JavaScript

它的实现是输出到HTML元素,但您应该能够轻松地调整它以满足您的需求。

接受的应答只记录长度为1的数组。如果你给它一个包含4个不同元素的数组,你期望所有的排列(它应该记录4! = 4*3*2*1 = 24项,但它只记录3项(和第四个未定义的?))

这里,我将接受的答案改编为记录所有预期排列的东西。我在我修改的被接受的答案的特定行上留下了评论。一旦接受的答案被编辑,我会删除我的反对票。你看,我的答案和另一个关于排列的SO答案是一致的。这里可以看到JSFiddle

function allcombs(a) {
  var all = [];
    var permuteCount = 0;
  function combs(arr, str) {
    permuteCount++;
    var arrCopy, popped, str = str || []; // initialize str 
    console.error(arr.length);
    for (var i = 0; i < arr.length; i++) {
      arrCopy = arr.slice(0); // need to slice (copies values out of arr), not splice (moves values out and *empties* arr; affecting the *if* check at the end of this function
      popped = arrCopy.splice(i, 1)
      combs(arrCopy, str.concat(popped)); // <- need to concatenate to accumulate results
    }
    if (arr.length === 0) {
      all.push(str);
      console.log(str);
    }
  }
  combs(a);
    console.error(permuteCount);
  return all;
}
var result = JSON.stringify(allcombs(["red", "green", "blue", "purple"]), null, 4).replace(/],/g, '],<br/>');
// document.body.innerHTML = result;
console.log('final result ', result);