递归函数实现迷宫路径遍历问题求助:代码无法运行
解决迷宫路径遍历的问题
你的代码思路方向是对的,但有几个关键细节问题导致无法正常输出正确路径,我来帮你一一排查并修正:
问题分析
数组引用传递的陷阱:
你直接把previousCols数组传入递归函数,而数组是引用类型,所有递归分支都会修改同一个数组实例,导致不同路径的列索引互相干扰,最终输出的路径会混乱重叠。终止条件判断错误:
迷宫的行数是从0到3(共4行),当row等于3时已经到达最后一行,应该停止递归并输出路径。原代码里row < m会让递归继续执行到row=4才停止,这时候路径会多出来无效的一步。列边界判断逻辑错误:
列索引的有效范围是0到3,col + 1不能超过3,所以判断右下方单元格是否存在的条件应该是col < m - 1而不是col < m,否则会尝试访问不存在的列(索引4)。
修正后的代码
const m = 4; const maze = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16] ]; const getPaths = (previousCols, row, col) => { // 创建新数组副本,确保每个递归分支的路径独立 const currentPath = [...previousCols, col]; // 到达最后一行时直接输出路径 if (row === m - 1) { console.log(currentPath); return; } // 向下移动到正下方单元格 getPaths(currentPath, row + 1, col); // 向下移动到左下方(列索引大于0时才允许) if (col > 0) { getPaths(currentPath, row + 1, col - 1); } // 向下移动到右下方(列索引小于最大索引时才允许) if (col < m - 1) { getPaths(currentPath, row + 1, col + 1); } }; // 遍历顶部4个起始单元格,逐个发起路径查找 for (let i = 0; i < m; i++) { getPaths([], 0, i); }
代码说明
- 数组副本处理:每次递归时用
[...previousCols, col]创建新的数组,确保每个递归分支的路径都是独立的,不会被其他分支修改。 - 正确的终止逻辑:当
row === m - 1时,说明已经走到迷宫最后一行,直接输出当前路径即可。 - 修正列边界判断:
col < m - 1保证右下方的单元格存在,避免出现数组越界访问的问题。
运行这段代码后,就能正确输出所有符合要求的路径,你示例中的[3, 2, 2, 1]也会包含在输出结果里。
内容的提问来源于stack exchange,提问作者Kylo TheDev
相关产品推荐
相关产品推荐

