我想构造一个函数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
时,我不知道如何循环。
答案 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)])