【发布时间】:2011-07-14 12:55:36
【问题描述】:
这是我在这里的第一个问题,我希望有人可以帮助我。 我是 iPhone 编程的新手,想尝试一个简单的应用程序...... 这是一个使用递归方法的数独求解器。在 JAVA 中,这段代码没有问题,但在 Objective-C 中,当数独被解决时,代码并没有停止。它仍在尝试解决数独问题并稍后停止。
谁有想法?!
这是代码。
- (SudokuSolver *) initWithField: (int[9][9]) field {
self = [super init];
if(self) {
for (int i=0; i<9; i++) {
for (int j=0; j<9; j++) {
sudokuField[i][j] = field[i][j];
if (field[i][j]) {
sudokuFieldStatic[i][j] = 1;
} else {
sudokuFieldStatic[i][j] = 0;
}
}
}
}
return self;
}
- (void) solve {
[self solveFieldAtRow:0 andCol:0];
}
- (void) solveFieldAtRow: (int) row andCol: (int) col {
if (row > 8) {
return;
} else {
while (sudokuField[row][col] != 0) {
if (++col > 8) {
col = 0;
row++;
if (row > 8) {
return;
}
}
}
for (int num=1; num<10; num++) {
if ([self checkRow:row forNumber:num] && [self checkCol:col forNumber:num] && [self checkFieldAtRow:row andCol:col forNumber:num]) {
sudokuField[row][col] = num;
[self showFieldInConsole:0];
if (col < 8) {
[self solveFieldAtRow:row andCol:col+1];
} else {
[self solveFieldAtRow:row+1 andCol:0];
}
}
}
sudokuField[row][col] = 0;
}
}
【问题讨论】:
-
能否也分享一下
sudokuField的声明和初始化? -
有些代码不在这里,所以快速检查一下:您是否收到任何编译器警告?如果您在
checkRow等方面遇到问题,例如总是返回非零,那么可能需要一些时间来完成求解。 -
递归模式不是很清楚。我建议重写它以在
solveFieldAtRow方法的开头放置一个row >= 9 || col >= 8检查。 -
当我插入一个 NSLOG();在“返回”上,它在正确的时间向我展示了,但是接下来会有更多的递归。我用 JAVA 编写了异常代码。
-
并且没有警告。我用调试测试了检查方法。一切正常
标签: objective-c recursion return void