def answer_solve_sudoku(__grid):
res = check_sudoku(__grid)
if res is None or res is False:
return res
grid = copy.deepcopy(__grid)
# find the first 0 element and change it to each of 1..9,
# recursively calling this function on the result
for row in xrange(9):
for col in xrange(9):
if grid[row][col] == 0:
for n in xrange(1, 10):
grid[row][col] = n
new = answer_solve_sudoku(grid)
if new is not False:
return new
# backtrack
return False
# if we get here, we found no zeros and so we're finished
return grid
这是代码,check_sudoku(grid)
如果网格是有效的数独,则可以返回。
我就是看不懂递归部分,我试着在纸上写下过程,但每次都失败,回溯是如何工作的?什么是new
?如果answer_solve_sudoku(grid)
有效?
我知道它每 0 到 1..9 设置一次,并检查它是否是有效的网格,但我无法在纸上绘制整个过程。并且无法真正理解回溯是如何工作的。
顺便说一句,对理解递归代码有什么建议吗?
最好的祝福,
盛云
编辑
我一遍又一遍地阅读代码,现在我有了一些理解,但我对此不太确定,如果有人给我一些意见,那就太好了。
1,return new
只有在求解器找到解决方案时才会调用,并且会在之后立即调用return grid
2、什么时候
# backtrack
return False
叫做?如果下一个解决方案不正确,check_sudoku(__grid)
将返回False
,如果下一个解决方案正确,它将调用另一个answer_solve_sudoku(grid)
解决方案,直到它得到正确的解决方案,当它得到正确的解决方案时,它会return grid
然后return new
。那么什么时候是:
# backtrack
return False
叫?