数独的javascript递归?

vim*_*uri 2 javascript sudoku

我正在进行一个数独谜题,所以我将所有项目都放在一个数组中.
因此,每当我得到一个无效的数字,我必须递归调用一个函数,但我不能这样做.我无法理解id的问题.

我的方法是:

function checkValidity(x,y) {
    var number = Math.floor((Math.random()) * 10);
    var validnumber = true;
        for (i = 0; i < 9; i++) {
            if (sudokuValueArray[i][y] == number) {
                validnumber = false;
            }
        }
        for (i = 0; i < 9; i++) {
            if (sudokuValueArray[x][i] == number) {
                validnumber = false;
            }
        }
    if(validnumber==true) {
        return number;
    }
    else if(validnumber == false) {
     return   checkValidity(x, y);
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个功能是:

function CreateSudokeSample() {
    for (var x = 0; x < 9; x++) {
        for (var y = 0; y < 9; y++) {
           sudokuValueArray[x][y] = checkValidity(x, y);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,我使用0启动了sudokuValueArray;

现在我如何获得递归?

sam*_*gak 6

你会因为递归过多而导致堆栈溢出.但是,即使您将代码更改为使用迭代算法,它也无法工作,因为遗憾的是算法已被破坏.

如果你遍历数组并添加随机值,每次检查它们是否有效,它仍然可能在没有可能添加值的情况下结束,尽管所有值都有效,直到该点为止.

例如,假设您生成前两行,如下所示:

3 9 5 7 1 2 6 4 8
5 1 6 2 4 3 7 9 ?
Run Code Online (Sandbox Code Playgroud)

你打算把什么放在空间里?

生成网格的另一种方法是从常规网格开始,例如:

1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9 1
3 4 5 6 7 8 9 1 2
4 5 6 7 8 9 1 2 3
5 6 7 8 9 1 2 3 4
6 7 8 9 1 2 3 4 5
7 8 9 1 2 3 4 5 6
9 1 2 3 4 5 6 7 8
Run Code Online (Sandbox Code Playgroud)

然后通过交换行,交换列或交换数字来随机化它(例如将所有2s更改为7s,将所有7s更改为2s等).