假设我有这样的模式:

for(let i =0; i < 3; i++){
  for(let j =0; j < 3; j++){
    for(let k =0; k < 3; k++){
      console.log(i,j,k)
    }
  }
}

好处是我可以访问最内层循环中的所有迭代变量.ijk,缺点是它被硬编码为3级嵌套循环.如果我想要第四个,我需要手动添加代码.

我试图使用递归来概括代码,在这里我可以将嵌套循环的数量设置为任意变量.以下是我正在try 的:

const maxNestedLoops = 3;
const iterations = 3;

const indexes = [];

function looper(loopNumber){  
  for(indexes[loopNumber] = 0; indexes[loopNumber] < iterations; indexes[loopNumber]++){

     if(loopNumber < maxNestedLoops){
      looper(loopNumber + 1);
     }
      console.log(indexes);

  }
}

looper(0);

第一种方法在控制台中产生以下结果:

0, 0, 0
0, 0, 1
0, 0, 2
0, 1, 0
0, 1, 1
0, 1, 2
0, 2, 0
0, 2, 1
0, 2, 2
...and so on

但是,对于我的递归函数示例,情况不同:

[0, 0, 0, 0]
[0, 0, 0, 1]
[0, 0, 0, 2]
[0, 0, 0, 3]
[0, 0, 1, 0]
[0, 0, 1, 1]
[0, 0, 1, 2]
[0, 0, 1, 3]
[0, 0, 2, 0]
[0, 0, 2, 1]
[0, 0, 2, 2]
[0, 0, 2, 3]
[0, 0, 3, 3]
...and so on

问题是,不仅有四个指标,而不是三个.但有些数值是3,我预计它只会上升到2.

感谢您的建议.

推荐答案

问题是:

  • 你的console.log只应该在最深层执行.所以把console.log放在else子句中.

  • 基本情况发生在loopNumber === maxNestedLoops - 1时,因为这是数组的最后一个索引,所以if条件应该与之对应

     if (loopNumber < maxNestedLoops - 1){
         looper(loopNumber + 1);
     } else {
         console.log(indexes);
     }

Javascript相关问答推荐

我应该在redux reducer中调用其他reducer函数吗?

我可以使用CSS有效地实现最大宽度=100%和最大高度=100%,而无需父母有明确的/固定的宽度和高度,替代方法吗?

未捕获错误:在注销后重定向到/login页面时找不到匹配的路由

如何在Connect 4游戏中 for each 玩家使用位板寻找7形状?

使用javascript将Plotly Expandable Sparkline转换为HighCharter Plot在bslib卡中

使用i18next在React中不重新加载翻译动态数据的问题

为什么Mutations 观察器用微任务队列而不是macrotask队列处理?

如何在Angular17 APP中全局设置AXIOS

在WordPress中使用带有WPCode的Java代码片段时出现意外令牌错误

如何将innerHTML字符串修剪为其中的特定元素?

禁用.js文件扩展名并从目录导入隐式根index.js时,找不到NodeJS导入模块

在VS代码上一次设置多个变量格式

JavaScript将字符串数字转换为整数

我怎样才能点击一个元素,并获得一个与 puppeteer 师导航页面的URL?

是否有静态版本的`instanceof`?

脚本语法错误只是一个字符串,而不是一个对象?

如何在加载页面时使锚定标记成为焦点

在此div中添加一个类,并在一段时间后在Java脚本中将其删除

JSON Web令牌(JWT)错误:RSA密钥对的签名无效

如何导入我在Web Worker创建的函数?