【问题标题】:The return statement in PythonPython中的return语句
【发布时间】:2014-02-02 18:55:20
【问题描述】:

我知道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 语句,为什么执行仍然失败并打印出来?非常感谢

【问题讨论】:

  • 在放置该语句时变得更加困惑:xxx 循环 174 在 175 个循环后得出解决方案 2:7 6 2 5 9 3 1 4 8 9 4 1 2 7 8 5 3 6 8 3 5 4 6 1 7 9 2 1 9 8 6 2 5 3 7 4 4 7 6 3 8 9 2 5 1 2 5 3 7 1 4 6 8 9 5 8 7 1 4 6 9 2 3 3 1 4 9 5 2 8 6 7 6 2 9 8 3 7 4 1 5 xxx 循环 175 内循环 176 内循环 176 内循环 176 内循环 176 内循环 176 内循环 176 内循环 176 内循环 176 内循环 176 内循环 176 内循环 176

标签: python recursion return


【解决方案1】:
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

【讨论】:

  • 给我一些时间——我正在运行你程序的逻辑。我对自递归函数有点生疏了。
  • 我没有和你一样的输出——你确定这是同一个代码吗?当我复制/粘贴此内容时,它无法正确解决数独问题。 This is the output I get
  • 啊哈!我发现了错误。我在 Python3 中运行它,所以 25/10 == 2.5 而不是在 Python2 中 25/10 == 2。我切换到楼层划分,现在工作正常。让我继续跑吧……
【解决方案2】:

因为done 没有设置。并非所有解决问题的电话都已返回。有些人坐在递归的solve 步骤。您打印出您的after...,然后返回到上一个解决呼叫。然后他们继续你快乐的方式。

【讨论】:

    猜你喜欢
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    相关资源
    最近更新 更多