JavaScript数独求解器开启debugger时console.log输出结果不一致
数独求解器Debugger依赖问题
问题代码
solveSudoku = ()=>{ let sectionsCopy_ =sectionsCopy for(let sect =0; sect< 9; sect++){ for(let box =0; box <9; box++){ if(sectionsCopy[sect][box] === ''){ for(let num=1; num<=9;num++){ if(this.isPossible(sect,box,num)){ sectionsCopy[sect][box]=''+num this.solveSudoku() sectionsCopy[sect][box]='' } } return } } } debugger console.log(sectionsCopy) }
上下文说明
sectionsCopy是类的全局变量sectionsCopy_仅用于调试,查看全局变量值isPossible()用于判断数字num在指定位置是否合法sect代表数独中3x3宫格的索引box代表数独中单个单元格的索引
问题详情
给定初始数独数组:
[ ["2","6","" ,"4","7","" ,"5","8","1"], ["","","3","","","","","","4"], ["","1","5","","","8","7","6","3"], ["","3","","","","6","","","8"], ["4","8","9","","","2","3","1",""], ["","7","","8","3","","","",""], ["6","9","","3","","","","1",""], ["","","8","","9","","5","",""], ["","","7","2","","","","9","6"] ]
未开启debugger时,console.log(sectionsCopy)输出结果异常;开启debugger后,输出正确的数独解。两者结果不一致,尝试输出sectionsCopy_也无效果。
问题原因
- console.log延迟求值:JavaScript中
console.log对数组这类引用类型是延迟求值的,它只会保存数组的引用,而非当前状态的快照。当递归回溯完成后,数组已被重置为空值,控制台显示的是最终修改后的状态。而开启debugger时,代码暂停在求解完成的节点,控制台会快照此时的数组状态,所以显示正确结果。 - 递归未终止:找到完整解后没有终止后续回溯逻辑,代码依然会执行
sectionsCopy[sect][box]='',把填好的数字清空,最终数组回到错误状态。
修复方案
solveSudoku = ()=>{ for(let sect =0; sect< 9; sect++){ for(let box =0; box <9; box++){ if(sectionsCopy[sect][box] === ''){ for(let num=1; num<=9;num++){ if(this.isPossible(sect,box,num)){ sectionsCopy[sect][box]=''+num // 递归找到解则向上传递标记,终止回溯 if(this.solveSudoku()){ return true; } sectionsCopy[sect][box]='' } } // 所有数字尝试后无解,返回标记 return false; } } } // 打印数组快照,确保输出当前状态 console.log(JSON.parse(JSON.stringify(sectionsCopy))); return true; }
说明
- 递归返回
true时,上层递归会直接终止回溯,保留已填好的正确解。 - 使用
JSON.parse(JSON.stringify(...))深拷贝数组,确保console.log输出的是求解完成时的数组状态,而非后续被修改的状态。
内容的提问来源于stack exchange,提问作者Mina Eskandar
相关产品推荐
相关产品推荐

