Javascript 数独的递归?
Javascript recursion for sudoku?
我正在做一个数独游戏,所以我把所有的项目都放在一个数组中。
所以,每当我得到一个无效数字时,我都必须递归地调用一个函数,但我不能那样做。我不明白问题是什么。
我的方法是:
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;
现在如何获得递归?
你的递归工作得很好。您的代码的问题是您使用的算法不太可能产生有效的数独游戏。
有时无法找到有效数字,因此您的递归一直进行到调用堆栈超出为止。
您因递归过多而导致堆栈溢出。但是,即使您将代码更改为使用迭代算法,它也不会工作,因为不幸的是算法被破坏了。
如果您遍历数组并添加随机值,每次都检查它们是否有效,尽管所有值都有效直到那一点。
例如,假设您像这样生成前两行:
3 9 5 7 1 2 6 4 8
5 1 6 2 4 3 7 9 ?
你要在 space 中放入什么?
另一种生成网格的方法是从规则网格开始,例如:
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
然后通过交换行、交换列或交换数字(例如,将所有 2 变为 7,将所有 7 变为 2 等)对其进行随机化。
我正在做一个数独游戏,所以我把所有的项目都放在一个数组中。
所以,每当我得到一个无效数字时,我都必须递归地调用一个函数,但我不能那样做。我不明白问题是什么。
我的方法是:
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;
现在如何获得递归?
你的递归工作得很好。您的代码的问题是您使用的算法不太可能产生有效的数独游戏。
有时无法找到有效数字,因此您的递归一直进行到调用堆栈超出为止。
您因递归过多而导致堆栈溢出。但是,即使您将代码更改为使用迭代算法,它也不会工作,因为不幸的是算法被破坏了。
如果您遍历数组并添加随机值,每次都检查它们是否有效,尽管所有值都有效直到那一点。
例如,假设您像这样生成前两行:
3 9 5 7 1 2 6 4 8
5 1 6 2 4 3 7 9 ?
你要在 space 中放入什么?
另一种生成网格的方法是从规则网格开始,例如:
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
然后通过交换行、交换列或交换数字(例如,将所有 2 变为 7,将所有 7 变为 2 等)对其进行随机化。