Javascript 如何在参数数量不断增加的幂循环中使用递归?

Javascript 如何在参数数量不断增加的幂循环中使用递归?,javascript,recursion,Javascript,Recursion,这是一个典型的,我只需要一个简单和优雅(紧凑)的解决方案。。。我将首先展示嵌套for循环的问题/解决方案示例。假设我需要将这段代码转换为递归: console.log("bits","Binary") for (let i=0; i<2; i++) { show(i) for (let j=0; j<2; j++) { show(i,j) for (let k=0; k<2; k++) show(i,j,k) // ...

这是一个典型的,我只需要一个简单和优雅(紧凑)的解决方案。。。我将首先展示嵌套for循环的问题/解决方案示例。假设我需要将这段代码转换为递归:

console.log("bits","Binary")
for (let i=0; i<2; i++) {
    show(i)
    for (let j=0; j<2; j++) {
      show(i,j)
      for (let k=0; k<2; k++)
        show(i,j,k) // ... l,m,n,o,p
  } // j
} // i

function show(...args) {
   let code = String( args.reduce( (ac,cur) => ''+ac+cur ) )
   console.log( code.length, code )
}

丑陋的部分解决方案 我正在尝试使用以下作为参考来解决问题:


您可以使用一个函数,该函数为生成的值获取一个临时数组

函数显示(…参数){
让代码=args.join(“”);
console.log(code.length,code);
}
函数callManyTimes(最大值、cb、项=[])){
变量i,温度;
如果(items.length==max.length)返回;
对于(i=0;icallManyTimes([2,2,2],show)一个简单的回溯递归函数将按照第一个示例的顺序访问这些函数,如下所示:

函数iter(最大长度,cur=''){
如果(cur.length>=maxlength)返回
for(设i=0;i<2;i++){
console.log(cur.length+1+“:”,cur+i)
iter(最大长度,cur+i)
}
}

iter(3)
我想你正在寻找

callManyTimes([2,2,2],show);
函数callManyTimes(maxIndexes,func,args=[])){
如果(maxIndexes.length==0){
func(…args);
}否则{
func(…args);
var rest=maxindex.slice(1);
var指数=args.length;
args=args.slice();
对于(args[index]=0;args[index]}
您可以手工编写输出并使用
.repeat()

const f=(a,b,c=[a+b,b+a,a+b+a,a+a+b,a+b+b,b+a+b,b+b+a,b+a+a])=>{
对于(让i=3;i;c.推(a.重复(i),b.重复(i)),i--);返回c
};

log(f('0','1')您将示例问题简化为纯字符串算法,但它非常优雅(!),因此也是一个有效的答案。。。那么,如何投票“接受”?也许对读者来说,这是最简单和最有教育意义的,但Nina的解决方案对我来说是必须的有用。谢谢(!),这是对我的“尝试解决”代码的完美更正。是的,回答比你之前的问题要好得多:-)好的一行程序(!),它就像一个组合缓存。。。但它不是通用的,还需要一个通用的组合生成器(它不仅要将
3
更改为
8
,以获得8级循环)。@PeterKrauss是的,由于输出受限,代码部分由手动主控器组成。类似于通常要写入的字节数小于
让a='abcdefghjjklmnopqrstuvwxyz
a=${Object.keys(top)}`.match(/[a-z]/g)
(未排序)或
a=[…新集(`${Object.keys(top)}.match(/[a-z]/g])。join
bits Binary
1 '0'
2 '00'
3 '000'
3 '001'
2 '01'
3 '010'
3 '011'
1 '1'
2 '10'
3 '100'
3 '101'
2 '11'
3 '110'
3 '111'
callManyTimes([2,2,2], show);

function callManyTimes(maxIndices, func) {
    doCallManyTimes(maxIndices, func, [], 0);
}

function doCallManyTimes(maxIndices, func, args, index) {
    if (maxIndices.length == 0) {
        let x = args.slice(0); // cloning
        while(x.length>0) {
          func(x); // why send array[array]?
          x.shift();
        }
    } else {
        var rest = maxIndices.slice(1);
        for (args[index] = 0; args[index] < maxIndices[0]; ++args[index]) {
            doCallManyTimes(rest, func, args, index + 1);
        }
    }
}

function show(...args) {
   if (typeof args[0] == 'object') args=args[0] // workaround... can optimize?
   let code = String( args.reduce( (ac,cur) => ''+ac+cur ) )
   console.log( code.length, code )
}
3 '000'
2 '00'
1 '0'
3 '001'
2 '01'
1 '1'
3 '010'
2 '10'
1 '0'
3 '011'
2 '11'
1 '1'
...