【发布时间】:2020-03-05 15:26:32
【问题描述】:
我编写了以下递归代码,用于解决数独难题。
grid:一个全局矩阵,代表拼图。
可能的功能:为给定的数字和位置返回真或假
解决:填充网格的递归。
但是我有一个错误,我怎样才能在不陷入死循环的情况下调试它。
是否有某种强制退出? 你能发现错误吗?
let grid = [
[5, 3, 0, 0, 7, 0, 0, 0, 0],
[6, 0, 0, 1, 9, 5, 0, 0, 0],
[0, 9, 8, 0, 0, 0, 0, 6, 0],
[8, 0, 0, 0, 6, 0, 0, 0, 3],
[4, 0, 0, 8, 0, 3, 0, 0, 1],
[7, 0, 0, 0, 2, 0, 0, 0, 6],
[0, 6, 0, 0, 0, 0, 2, 8, 0],
[0, 0, 0, 4, 1, 9, 0, 0, 5],
[0, 0, 0, 0, 8, 0, 0, 7, 9]];
function possible(x, y, n) {
for (let i = 0; i < 9; i++) {
if (grid[y][i] === n) {
return false
}
}
for (let i = 0; i < 9; i++) {
if (grid[i][x] === n) {
return false
}
}
let x0 = Math.floor(x / 3) * 3;
let y0 = Math.floor(y / 3) * 3;
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
if (grid[y0 + i][x0 + j] === n) {
return false
}
}
}
return true;
}
function solve() {
for (let y = 0; y < 9; y++) {
for (let x = 0; x < 9; x++) {
if (grid[y][x] === 0) {
for (let n = 1; n < 10; n++) {
if(possible(y,x,n)){
grid[y][x] = n;
solve();
grid[y][x] = 0;
}
}
return;
}
}
}
}
solve();
【问题讨论】:
-
有
debugger?取决于您的环境。 -
我不认为这里有错误的递归,而只是一个非常大的问题空间来递归。您可能需要一个不那么暴力的算法。
-
实际上,当网格完全解决时,可能应该有一个退出条件。 :) 否则
grid[y][x]行将撤消找到的任何解决方案。 -
@Adam 他们也在问我们是否可以发现错误。
-
这能回答你的问题吗? How can I debug my JavaScript code?
标签: javascript recursion exit