Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有置换长度参数的javascript置换生成器_Javascript_Node.js_Permutation - Fatal编程技术网

带有置换长度参数的javascript置换生成器

带有置换长度参数的javascript置换生成器,javascript,node.js,permutation,Javascript,Node.js,Permutation,我见过一些发电机,但它们都是平方矩阵。例如,您给它一个包含三项的列表,它将假定长度的输出也是三项。但是,我想指定项目和长度 听起来这是个容易的问题,真不敢相信没有图书馆可以解决它。如果有一个经过测试的库,我想避免自己写这个。任何建议都很好 我发现的例子 var list = 'abc'; perms = permutations(list); //you cannot define the length 范例 var list = 'abc'; var length = 3; perms =

我见过一些发电机,但它们都是平方矩阵。例如,您给它一个包含三项的列表,它将假定长度的输出也是三项。但是,我想指定项目和长度

听起来这是个容易的问题,真不敢相信没有图书馆可以解决它。如果有一个经过测试的库,我想避免自己写这个。任何建议都很好

我发现的例子

var list = 'abc';
perms = permutations(list);
//you cannot define the length
范例

var list = 'abc';
var length = 3;

perms = permutations(list,length);

console.log(perms);

/* output
a,a,a
a,b,c
a,b,a
a,c,a
c,a,a
...
*/
我想能够改变长度,并应创建相应的排列

length = 2

a,a
a,b
b,b
b,a

length = 4

a,a,a,a 
a,a,a,b
....

可以将长度想象为表示插槽数量的长度。每个插槽都有N个可能性,因为N是初始列表中的元素数。因此,给定三个值
[1,2,3]
,您将得到总共
3x3x3=27
排列

这是我的尝试。评论包括在内

var列表=[1,2,3];
var getPermutations=函数(列表,maxLen){
//将初始值复制为数组
var perm=list.map(函数(val){
返回[val];
});
//我们的置换生成器
var generate=函数(perm、maxLen、currLen){
//达到所需长度
如果(currLen==maxLen){
回烫;
}
//对于每个现有排列
对于(变量i=0,len=perm.length;iconsole.log(res.length);//27
我编写了一个小库,它使用生成器为您提供自定义项和元素数量的排列


有点晚了,但也许这会有帮助。允许重复,长度规格:)

函数样本置换(序列,重复=false,n=null){
if(sequence.constructor!==数组){
抛出新错误(“samplePermutation:序列需要是数组。”);
}
如果(n==null){
n=序列长度;
} 
var置换=[];
var-add;
而((repeation&&(permutation.length
如果您正在寻找基于性能的答案,您可以使用数组的长度作为数字基数,并基于此基数访问数组中的元素,基本上用数组中的值替换基数中的实际值,并使用计数器按顺序访问每个值:

const getCombos=(arr,len)=>{
常数基=arr.length
常量计数器=数组(len).fill(基===1?arr[0]:0)
if(base==1)返回[计数器]
常量组合=[]
常数增量=i=>{
if(计数器[i]==基-1){
计数器[i]=0
增量(i-1)
}否则{
柜台[i]++
}
}
for(设i=base**len;i--;){
常量组合=[]
for(设j=0;jconsole.log(combos)
到目前为止您做了什么?我发现了一个npm模块组合\u gen,它以这种方式生成组合,但不支持排列。在此之前,我试图通过循环列表来编写我自己的代码,但发现它比看起来更难。你所说的长度是什么意思?是否可以检查代码?@ProllyGeek他指的是生成的排列的长度。
const G = require('generatorics')

for (let perm of G.permutation(['a', 'b', 'c'], 2)) {
  console.log(perm);
}
// [ 'a', 'b' ]
// [ 'a', 'c' ]
// [ 'b', 'a' ]
// [ 'b', 'c' ]
// [ 'c', 'a' ]
// [ 'c', 'b' ]
function samplePermutation(sequence, repetition = false, n = null) {
  if (sequence.constructor !== Array) {
    throw new Error("samplePermutation: sequence needs to be an array.");
  }

  if (n === null) {
    n = sequence.length;
  } 

  var permutation = [];
  var add;
  while ((repetition && (permutation.length < n)) || ((!repetition) && (sequence.length))) {
    var index = Math.floor(Math.random() * sequence.length);
    if (repetition) {
      add = sequence[index];
    } else {
      add = sequence.splice(index, 1);
    }
    permutation = permutation.concat(add);
  }

  return (permutation);
}