这里有一个递归的解决方案8皇后问题从https://wiki.python.org/moin/SimplePrograms。我很难理解solve函数中的return语句是如何工作的。乍一看,它似乎违反了规则(比如,在return语句中的循环之前没有声明解决方案或分配值,但它出现在return语句中的循环之前),但是我可以成功地运行它,所以我很好奇它是如何工作的,为什么有人会选择这样编写它(让人感到困惑?短?因为其他的限制,我还不明白?)

BOARD_SIZE = 8

def under_attack(col, queens):
    left = right = col

    for r, c in reversed(queens):
        left, right = left - 1, right + 1

        if c in (left, col, right):
            return True
    return False

def solve(n):
    if n == 0:
        return [[]]

    smaller_solutions = solve(n - 1)

    return [solution+[(n,i+1)]
        for i in xrange(BOARD_SIZE)
            for solution in smaller_solutions
                if not under_attack(i+1, solution)]
for answer in solve(BOARD_SIZE):
    print answer

我熟悉一些实验和课程中问题的递归解决方案,但我对python整体来说还很陌生(我在类和自己的类中主要使用java和C)。
有没有人有好的方法来解释这个语法是如何工作的,或者我可以学习其他的例子来帮助我理解它?这真的刺痛了我的好奇心。。。

最佳答案

我猜你的困惑是这一行代码:

       v---- this starts the list
return [solution+[(n,i+1)]
        for i in xrange(BOARD_SIZE)
            for solution in smaller_solutions
                if not under_attack(i+1, solution)]
                                                  ^-- this ends the list

这实际上是一种list comprehension,一种创建列表的简便方法。
这是那个循环的长手版本。
x = []
for i in xrange(BOARD_SIZE):
    for solution in smaller_solutions:
        if not under_attack(i+1, solution):
            x.append(solution+[(n, i+1)])
return x

关于python - 此return语句究竟指示程序执行什么操作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18975935/

10-10 00:55