繁体   English   中英

Javascript - 递归过多

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM