[英]Javascript - Too much recursion
所以,我正在制作一个 function 来解决 4x4 数独问题。 它接受一个二维数组,所有空字段都替换为 0。 使用 isSafe function,我试图将检查拆分为多个函数,这样更容易阅读。 虽然我已经尝试了一些 forms 来避免太多的递归来实现一定数量的检查等。
我已经尝试设置 maxIterations,尝试返回 false,返回 null...真的是没有想法。
我注意到它崩溃得非常快,它只能解决几个数字然后发生错误。 如果谁有更有效的方法请评论。
function solverFor4x4(grid) {
let number = generateRandom(1, 5, [0, 5]);
if (!number) {
return;
}
console.log(number)
for (let i = 0; i < grid.length; i++) {
for (let j = 0; j < grid[i].length; j++) {
if(grid[i][j] == 0 && isSafe(grid, number, i, j)) {
grid[i][j] = number;
}
}
}
showSolution(grid);
}
function isSafe(grid, number, i, j) {
if(isSafeRow(grid, number, i, j) && isSafeColumn(grid, number, i, j) && isSafeArea(grid, number, i, j)) {
return true;
}
}
function isSafeRow(grid, number, i, j) {
if (grid[i].includes(number)) {
solverFor4x4(grid);
} else {
return true;
}
}
function isSafeColumn(grid, number, i, j) {
let array = [];
for (let i = 0; i < grid.length; i++) {
if(grid[i][j] == number) {
solverFor4x4(grid);
} else {
array.push(grid[i][j]);
}
}
if(array.includes(number)) {
solverFor4x4(grid);
} else {
return true;
}
}
function isSafeArea(grid, number, i, j) {
return true;
}
function generateRandom(min, max, exclude) {
let random;
let counter = 0;
const maxIterations = 100;
while (!random && counter < maxIterations) {
const x = Math.floor(Math.random() * (max - min + 1)) + min;
if (exclude.indexOf(x) === -1) {
random = x;
}
counter++;
}
return random || null;
}
编辑:忘记放置代码,抱歉。
这是更新后的代码:
function solverFor4x4(grid) {
let number = generateRandom(1, 5, [0, 5]);
if (!number) {
return;
}
console.log(number)
for (let i = 0; i < grid.length; i++) {
for (let j = 0; j < grid[i].length; j++) {
if(grid[i][j] == 0 && isSafe(grid, number, i, j)) {
grid[i][j] = number;
}
}
}
showSolution(grid);
}
function isSafe(grid, number, i, j) {
if(isSafeRow(grid, number, i, j) && isSafeColumn(grid, number, i, j) && isSafeArea(grid, number, i, j)) {
return true;
} else {
return false;
}
}
function isSafeRow(grid, number, i, j) {
if (grid[i].includes(number)) {
return false;
} else {
return true;
}
}
function isSafeColumn(grid, number, i, j) {
let array = [];
for (let i = 0; i < grid.length; i++) {
if(grid[i][j] == number) {
return false;
} else {
array.push(grid[i][j]);
}
}
if(array.includes(number)) {
return false;
} else {
return true;
}
}
function isSafeArea(grid, number, i, j) {
return true;
}
function generateRandom(min, max, exclude) {
let random;
let counter = 0;
const maxIterations = 100;
while (!random && counter < maxIterations) {
const x = Math.floor(Math.random() * (max - min + 1)) + min;
if (exclude.indexOf(x) === -1) {
random = x;
}
counter++;
}
return random || null;
}
如果不工作试试这个:
function solverFor4x4(grid) {
let number = generateRandom(1, 5, [0, 5]);
if (!number) {
return;
}
console.log(number)
for (let i = 0; i < grid.length; i++) {
for (let j = 0; j < grid[i].length; j++) {
if(grid[i][j] == 0 && isSafe(grid, number, i, j)) {
grid[i][j] = number;
break;
}
}
}
showSolution(grid);
}
function isSafe(grid, number, i, j) {
if(isSafeRow(grid, number, i, j) && isSafeColumn(grid, number, i, j) && isSafeArea(grid, number, i, j)) {
return true;
}
return false;
}
function isSafeRow(grid, number, i, j) {
return !grid[i].includes(number);
}
function isSafeColumn(grid, number, i, j) {
for (let i = 0; i < grid.length; i++) {
if(grid[i][j] == number) {
return false;
}
}
return true;
}
function isSafeArea(grid, number, i, j) {
return true;
}
function generateRandom(min, max, exclude) {
let random;
let counter = 0;
const maxIterations = 100;
while (!random && counter < maxIterations) {
const x = Math.floor(Math.random() * (max - min + 1)) + min;
if (exclude.indexOf(x) === -1) {
random = x;
}
counter++;
}
return random || null;
}
看起来代码的问题在于,如果所有检查都返回 true,它不会使用放置的数字更新网格。 此外,如果其中一项检查失败,“isSafe”function 不会返回 false。 尝试修改代码如下:
function solverFor4x4(grid) {
let number = generateRandom(1, 5, [0, 5]);
if (!number) {
return;
}
console.log(number)
for (let i = 0; i < grid.length; i++) {
for (let j = 0; j < grid[i].length; j++) {
if(grid[i][j] == 0 && isSafe(grid, number, i, j)) {
grid[i][j] = number;
solverFor4x4(grid);
}
}
}
showSolution(grid);
}
function isSafe(grid, number, i, j) {
if(isSafeRow(grid, number, i, j) && isSafeColumn(grid, number, i, j) && isSafeArea(grid, number, i, j)) {
return true;
}
return false;
}
function isSafeRow(grid, number, i, j) {
if (grid[i].includes(number)) {
return false;
} else {
return true;
}
}
function isSafeColumn(grid, number, i, j) {
let array = [];
for (let i = 0; i < grid.length; i++) {
if(grid[i][j] == number) {
return false;
} else {
array.push(grid[i][j]);
}
}
if(array.includes(number)) {
return false;
} else {
return true;
}
}
这应该可以解决问题,但请记住,由于随机数生成方法,function 可能仍无法正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.