【问题标题】:Why an infinite loop forms in the piece of JavaScript code below?为什么在下面这段 JavaScript 代码中形成了无限循环?
【发布时间】:2020-11-21 10:23:15
【问题描述】:

在 isValid 函数中,当尝试在第一个 for 循环中编写任何代码行时,会创建一个无限循环。例如,当我尝试控制台记录 i 时,它只会继续记录它并且永不停止。

我猜这与递归有关,但我无法找到确切的原因。

问题出在 //check same row section

// is Valid
function isValid(board, pos, num){
    //check same row
    for(var i=0; i<9; i++){
      
        // any line here creates problem
        //console.log(i);
      
        if(board[pos[0]][i] == num && i != pos[1]){
            return false;
        }
    }

    //check same column
    for(var i=0; i<9; i++){
        if(board[i][pos[1]] == num && i != pos[0])
            return false;
    }

    //check grid
    var box_x = Math.floor(pos[0]/3);
    var box_y = Math.floor(pos[1]/3);
    for(var i=box_x*3; i<(box_x*3)+3; i++){
        for(var j=box_y*3; j<(box_y*3)+3; j++){
            if(num == board[i][j]){
                return false;
            }
        }
    }

    return true;
}
var board = [
    [8,0,0,0,0,0,0,0,0],
    [0,0,0,2,6,0,0,5,0],
    [0,0,9,8,0,0,0,0,4],
    [7,0,3,0,0,0,0,2,0],
    [0,0,0,0,4,0,0,8,1],
    [5,0,0,0,0,7,0,3,0],
    [0,5,0,0,0,9,2,4,0],
    [0,0,0,7,0,0,0,0,0],
    [9,1,0,0,0,0,0,0,0],
]


// find Empty Cells
function findEmpty(board){
    for(var i=0; i<9; i++){
        for(var j=0; j<9; j++){
            if(board[i][j] == 0){
                var pos = [i, j];
                return pos;
            }
        }
    } 
    var pos = [99,99];
    return pos;
}

//is Valid

function solve(board){
    var pos = findEmpty(board);
    if(pos[0] == 99)
        return true;
    for(var i=1; i<10; i++){
        if(isValid(board, pos, i)){
            board[pos[0]][pos[1]] = i;
            //div_update(pos[0], pos[1], i, board);

            if(solve(board))
                return true;

            board[pos[0]][pos[1]] = 0; //resetting Value
            //div_update(pos[0], pos[1], i, board);
        }
    }
    return false;
}

solve(board);
console.log(board);

【问题讨论】:

  • 为什么solve() 打电话给solve()
  • 该算法使用递归(回溯)来求解棋盘,这就是为什么solve调用solve来检查棋盘是否求解。

标签: javascript arrays function loops recursion


【解决方案1】:

这不是无限循环,如果您在第 7 行打印 console_log,您的脚本将尝试在控制台中打印 3,976.879 次值。对于浏览器或编辑器控制台将在几千行打印后生成冻结或停止显示新值。 如果您在 OS 终端中使用 node 运行此脚本,大约需要 15 分钟,然后才能成功完成。

【讨论】:

  • 那么显而易见的问题(9x9 板 15 分钟有点多)的解决方案?
  • 那么到底有什么问题,对于每个调用它应该控制台记录 9 个值?我错过了什么?
  • @JaySinha 您的代码所做的是用“1”和“9”之间的值替换“0”位置,该值不会在同一行、列或对角线中重复,对吧?因此,isValid 函数将被调用数百万次,直到找到完美的值组合。您真的想在每次调用 Valid 时打印一个 console.log 吗? IO 操作很慢,因此,当您删除 console.log 时,脚本会在几秒钟内运行。
猜你喜欢
  • 2020-02-02
  • 2013-12-13
  • 2013-04-25
  • 2013-08-10
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多