【发布时间】: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