JavaScript“薛定谔的输出结果”

704 阅读2分钟

今天调试代码时遇到了个诡异事件

代码是关于一个简单的回溯法问题

在3*3方阵中填入1到10内某9个整数,每方格填一个,使所有相邻两个方格两个整数之和为质数,输出满足要求的情况总数

写完后我尝试输出了所有可能的情况,128这个结果是对的,问题出在每个二维数组都是未被赋值的状态。

这是我心想可能是我赋值语句写的有问题,于是就试着下断点单步调试

如图res使用来储存所有结果的数组,board是当前棋盘的状态,col>2是递归结束的条件,依次把所有结果push入res,在push后我加入了一个console并下了断点想看看每次push前board是否像输出的结果那样全是0。

第一次输出,可以看到board此时并不全是0:

第二次输出,依旧没问题:

于是我心想可能刚才是意外,这次输出应该可以正常输出了,于是取消了断点

问题又来了,除了我单步调试输出的那两次,其余的输出依旧变为了全0:

在最后输出res时,前两个也变成了全0:

这就好像这个程序需要我盯着似的,如果不是我单步调试它就不正常输出。实在想不明白是哪里出了问题,下面贴上代码,还请知道原因的大神 指点一下:

let judge=(row, col, num,used,board)=>{
    let primeArray = [3, 5, 7, 11, 13, 17,19]
    let sum
    if (used.indexOf(num) > -1) return false
    if (row > 0) {
        sum = num + board[row - 1][col]
        if (!(primeArray.indexOf(sum) > -1)){return false}
    }
    if (col>0){
        sum=num+board[row][col-1]
        if(!(primeArray.indexOf(sum)>-1)){return false}
    }
    return true
}

let solve=()=>{
    let res=[]
    let used=[]
    let trueBoard=[[0,0,0],[0,0,0],[0,0,0]]
    let putNumber=(row,col,board)=>{
        if(col>2){
            res.push(board)    //**************问题出现在这里*****************
            console.log(board)
            return
            }
        for(let i=1;i<11;i++){
            if(judge(row,col,i,used,board)){
                used.push(i)
                board[row][col]=i
                if(row!=2){
                    putNumber(row+1,col,board)
                }
                else {
                    putNumber(0,col+1,board)
                }
                board[row][col]=0
                used.pop()
            }
        }
    }
    putNumber(0,0,trueBoard)
    return res
}
console.log(solve())