为了账号安全,请及时绑定邮箱和手机立即绑定

数独求解器可以在 python 中运行,但不能在 javascript 中运行

数独求解器可以在 python 中运行,但不能在 javascript 中运行

一只斗牛犬 2023-11-02 19:57:20
因此,我观看了有关编写数独求解器的 Computerphile 视频,并设法让代码在 python 中运行,这就是我得到的:def possible(grid, y, x, n):for i in range(0,9):    if grid[y][i] == n:        return False    if grid[i][x] == n:        return Falsex0 = (x//3)*3y0 = (y//3)*3for i in range(0,3):    for j in range(0,3):        if grid[y0+i][x0+j] == n:            return Falsereturn Truedef solver(grid):    for y in range(9):        for x in range(9):            if grid[y][x] == 0:                for n in range(1,10):                    if possible(grid, y, x, n):                        grid[y][x] = n                        solver(grid)                        grid[y][x] = 0                return    print(np.matrix(grid))这段代码可以正常工作。但我想尝试让它在 Web 应用程序中工作,所以我将其转换为 Javascript,如下所示:function possible(board, y, x, n) {    for(i = 0; i < 9; i++) {        if(board[y][i] === n) {            return false;        }        if(board[i][x] === n) {            return false;        }    }    y0 = Math.floor(y/3)*3;    x0 = Math.floor(x/3)*3;    for(i = 0; i < 3; i++) {        for(j = 0; j < 3; j++) {            if(board[i+y0][j+x0] === n) {                return false;            }        }    }    return true;} function solver(board) {    for(y = 0; y < 9; y++) {        for(x = 0; x < 9; x++) {            if(board[y][x] === 0) {                for(n = 1; n < 10; n++) {                    if(possible(board, y, x, n)) {                        board[y][x] = n;                        solver(board);                        board[y][x] = 0;                    }                }                return;            }        }    }    console.log(board);}据我所知,这些函数是完全相同的,而且由于它可以在 Python 中工作,所以我不明白为什么它不能在 JavaScript 中工作。在 JS 中,它似乎从未到达 console.log(board) 行,所以我在徘徊是否达到最大递归深度或类似的简单东西。
查看完整描述

1 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

如果您在函数内使用 for 循环,var将创建一个局部变量,“no var”将查找作用域链,直到找到该变量或到达全局作用域。这意味着您需要var在 for 循环内创建变量时声明 ,以避免一个循环与另一个循环混淆。

所以你的代码应该是这样的:

function possible(board, y, x, n) {

    for (var i = 0; i < 9; i++) {

        if (board[y][i] === n) {

            return false;

        }

        if (board[i][x] === n) {

            return false;

        }

    }

    y0 = Math.floor(y / 3) * 3;

  

    x0 = Math.floor(x / 3) * 3;

    for (var i = 0; i < 3; i++) {

        for (var j = 0; j < 3; j++) {

            if (board[y0+i][x0+j] === n) {

                return false;

            }

        }

    }

    return true;

}


function solver(board) {

    for (var y = 0; y < 9; y++) {

        for (var x = 0; x < 9; x++) {

            if (board[y][x] === 0) {

                for (var n = 1; n < 10; n++) {

                  

                    if (possible(board, y, x, n)) {

                        board[y][x] = n;

                        solver(board);

                        board[y][x] = 0; 

                    } 


                }

              return

            }

        }

    }

    console.log(board);

}


查看完整回答
反对 回复 2023-11-02
  • 1 回答
  • 0 关注
  • 66 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信