Рекурсия Javascript для судоку?


Я работаю над головоломкой судоку, поэтому я помещаю все элементы в массив.
Поэтому всякий раз, когда я получаю недопустимое число, мне приходится вызывать функцию рекурсивно, но я не могу этого сделать. Я не могу понять в чем проблема удостоверение личности.

Мои методы:

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);
    }
}

И вторая функция:

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

По умолчанию я инициализировал sudokuValueArray с 0;

Теперь, как я могу получить рекурсию?

2 2

2 ответа:

Ваша рекурсия работает отлично. Проблема с вашим кодом заключается в том, что очень маловероятно, что алгоритм, который вы используете, может создать действительное судоку.

В какой-то момент становится невозможно найти допустимое число, поэтому ваша рекурсия просто идет и идет, пока стек вызовов не превысит.

Вы получаете переполнение стека от слишком большой рекурсии. Однако даже если вы изменили свой код, чтобы использовать итерационный алгоритм, он не будет работать, потому что, к сожалению, алгоритм сломан.

Если вы пройдете через массив и добавите случайные значения, проверяя, что они действительны каждый раз, все еще возможно оказаться в ситуации, когда нет никаких возможных значений для добавления, несмотря на то, что все значения действительны до этого момента.

Например, предположим, что вы создаете первый две строки Вот так:

3 9 5 7 1 2 6 4 8
5 1 6 2 4 3 7 9 ?

Что вы собираетесь поместить в пространство с помощью ?

Альтернативный способ генерации сетки-начать с регулярной сетки, например:
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

И затем рандомизируйте его, меняя местами строки, столбцы или числа (например, измените все 2s на 7s и все 7s на 2s и т. д.).