You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在每次递归调用后调整嵌套循环的起始位置?

不扁平化二维数组的递归遍历实现

当然可以在不扁平化数组的前提下实现需求。你的核心思路没问题,但原代码里硬编码的num=10容易导致无意义的递归(比如当二维数组子数组最长只有3列时,start到3之后的递归不会遍历任何元素),可以优化终止条件,让递归自动适配动态变化的数组结构。

修正后的代码

const tempRows = [[1,1,1], 
                  [1,1,1], 
                  [1,1,1]
                 ];

// 计算所有子数组的最大长度,作为递归的终止边界
const maxColLength = Math.max(...tempRows.map(row => row.length));

function traverse(start) {
  // 遍历每一行
  for (let i = 0; i < tempRows.length; i++) {
    const row = tempRows[i];
    // 从start位置开始遍历当前行的剩余元素
    for (let j = start; j < row.length; j++) {
      // 替换为你需要的业务逻辑,比如处理元素或打印信息
      console.log(`start=${start}, 元素=${row[j]}, 位置=[${i},${j}]`);
    }
  }
  
  // 当start未超过最大列长度时,递归调用并将起始位置后移一位
  if (start < maxColLength - 1) {
    traverse(start + 1);
  }
}

// 从起始位置0开始执行
traverse(0);

关键逻辑说明

  • 无需扁平化数组:通过嵌套循环直接操作原二维数组的行和列,完全保留原数组结构。
  • 动态终止条件:用maxColLength代替硬编码数值,自动适配子数组数量、长度变化的场景,避免无效递归。
  • 递归核心:每次递归将起始列索引start加1,实现每次遍历都从后移一位的位置开始执行。

如果业务逻辑确实需要固定递归num次(即使超过数组列数),可以保留原num的判断,但建议在循环内增加判断,避免无意义的循环执行。

内容的提问来源于stack exchange,提问作者maximosis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:35:20