Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.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 从n位数组返回k位数字的函数_Javascript_Arrays_Algorithm - Fatal编程技术网

Javascript 从n位数组返回k位数字的函数

Javascript 从n位数组返回k位数字的函数,javascript,arrays,algorithm,Javascript,Arrays,Algorithm,我想构造一个函数showNum(ar,k)从数组ar获取所有k位数字 例如,showNum([1,2,3],2)应该返回12,13,21,23,31,32 和showNum([1,2,3],1)应返回1,2,3 我的代码适用于k是fix的情况 例如,案例k为3 我的想法是循环3次 function showNum(a){ var ar = []; var n = a.length; for(i = 0; i <= n; i++){ for(j = 0;

我想构造一个函数
showNum(ar,k)
从数组
ar
获取所有k位数字

例如,
showNum([1,2,3],2)
应该返回
12,13,21,23,31,32

showNum([1,2,3],1)
应返回
1,2,3

我的代码适用于
k
是fix的情况

例如,案例
k
为3

我的想法是循环3次

   function showNum(a){
   var ar = [];
   var n = a.length;
   for(i = 0; i <= n; i++){
       for(j = 0; j <= n; j++){
           for(k = 0; k <= n; k++){
           if(a[i] != a[j] && a[i] != a[k] && a[k] != a[j]) ar.push(a[i]*100 + a[j]*10 + a[k]);
           }
       }
   }
   return ar;
}
函数showNum(a){
var-ar=[];
var n=a.长度;

对于(i=0;i递归在这里非常有用:在循环内部,进行递归调用以再次迭代数字。这可以使用生成器轻松完成:

 function* combinations(values, depth, previous = []) {
   if(depth <=0) {
     yield previous.reduce((res, n, i) => res + n * 10 ** i, 0);
     return;
  }

  for(const value of values) {
    if(previous.includes(value))
        continue;
    yield* combinations(values, depth - 1, [...previous, value]);
  }
}
函数*组合(值、深度、上一个=[]){
如果(深度分辨率+n*10**i,0);
返回;
}
for(值的常量值){
如果(以前的包括(价值))
继续;
收益率*组合(值,深度-1,[…先前,值]);
}
}

console.log([…compositions([1,2,3,2)])
在这种情况下,您需要尝试研究生成二进制范围算法感谢兄弟!顺便说一句,由于我是一个完全的初学者,生成器函数似乎对我不熟悉。
 [...combinations([1, 2, 3], 2)]