Python中的return语句

时间:2014-01-14 16:09:55

标签: python recursion return

我知道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)

这是一个解决数独谜题的程序,我检查输出我发现一个问题我无法理解为什么,输出是这样的:

output screenshot output screenshot 谁能告诉我为什么'xxx loop 125'和'xxx loop 175'正在打印?由于第32行中有return语句,为什么执行仍然停止并打印出来?非常感谢

2 个答案:

答案 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...然后返回到之前的求解电话。然后他们继续你的快乐方式。