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

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_也无效果。

问题原因

  1. console.log延迟求值:JavaScript中console.log对数组这类引用类型是延迟求值的,它只会保存数组的引用,而非当前状态的快照。当递归回溯完成后,数组已被重置为空值,控制台显示的是最终修改后的状态。而开启debugger时,代码暂停在求解完成的节点,控制台会快照此时的数组状态,所以显示正确结果。
  2. 递归未终止:找到完整解后没有终止后续回溯逻辑,代码依然会执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:05:16