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

时间:2019-04-25 10:23:51

标签: 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已修复的情况下工作良好。

例如,案例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;
}

但是当k任意小于n时,我不知道如何循环。

1 个答案:

答案 0 :(得分:3)

在这里递归非常有用:在循环内,进行递归调用以再次迭代数字。使用生成器可以很容易地做到这一点:

 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]);
  }
}

可用作:

 [...combinations([1, 2, 3], 2)]

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]);
  }
}

console.log([...combinations([1, 2, 3], 2)])