我知道return语句会使执行跳出函数。所以我对下面的程序感到担心,该程序递归地解决了Suduko难题:
class Puzzle:
def __init__(self):
self.loop = 0
self.answer = 0
self.done = False
def same_row(self,i,j):
return i/9 == j/9
def same_col(self,i,j):
return (i-j)%9 == 0
def same_block(self,i,j):
return (i/27 == j/27 and i%9/3 == j%9/3)
def print_format(self,a):
for row in range(9):
for col in range(9):
print '%s ' % a[9*row + col],
print ''
def solve(self,a):
self.loop += 1
if self.answer == 1 and self.loop>100000 or self.answer == 2:
self.done = True
i = a.find('0')
if i == -1:
self.answer += 1
print 'after %d loops worked out solution %d:' % (self.loop, self.answer)
self.print_format(a)
return
excluded_num = set()
for j in range(81):
if self.same_row(i,j) or self.same_col(i,j) or self.same_block(i,j):
excluded_num.add(a[j])
for m in '123456789':
if m not in excluded_num:
if self.done:
return
print 'xxx loop %d' % self.loop
self.solve(a[:i]+m+a[i+1:])
if __name__ == '__main__':
puz = Puzzle()
sudoku="060593000901000500030400090108020004400309001200010609080006020004000807000000000"
puz.solve(sudoku)
这是一个解决数独谜题的程序,我检查输出我发现一个问题我无法理解为什么,输出是这样的:
谁能告诉我为什么'xxx loop 125'和'xxx loop 175'正在打印?由于第32行中有return语句,为什么执行仍然停止并打印出来?非常感谢
答案 0 :(得分:2)
for m in '123456789':
if m not in excluded_num:
if self.done:
return
print 'xxx loop %d' % self.loop
self.solve(a[:i]+m+a[i+1:])
此循环将迭代9次(m == 1,m == 2,m == 3 ... m == 9)。即使它用m == 3完成求解,它仍然会经历6次迭代,它可能会运行该print语句。
顺便说一下,如果将Puzzle
定义为每个数独问题,这可能会更好。使用您的数独字符串对其进行初始化,并将其用作self.unsolved=pattern
。它在我的头脑中更有意义,而不是简单的解决谜题的机器。现在它不是class Puzzle
而是class PuzzleSolvingMachine
答案 1 :(得分:1)
因为未设置done
。并非所有要求解决的电话都已恢复。有些人坐在递归solve
步骤。您打印出after...
然后返回到之前的求解电话。然后他们继续你的快乐方式。