这是来自https://wiki.python.org/moin/SimplePrograms的8皇后问题的递归解决方案。我很难理解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)。
有没有人有一个很好的方法来解释这种语法是如何工作的,或者我可以研究的其他例子可能有助于我理解它?这真的激起了我的好奇心......
答案 0 :(得分:5)
我猜你的混淆是这行代码:
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
答案 1 :(得分:3)
您在询问列表推导。这是Python执行功能映射(将函数应用于列表的每个元素)和过滤器(在某些条件下过滤列表)的方法。
最简单的解释方法是举一些例子。
说:
>>> l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> [2 * i for i in l]
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
>>> [i for i in l if i > 5]
[6, 7, 8, 9, 10]
现在这些可以合并,你可以使用任意数量的:
>>> # squares of even numbers below 10
>>> [i * i for i in range(10) if i%2 == 0]
[0, 4, 16, 36, 64]
>>> # concatenating all lists
>>> ll = [[1, 2], [3, 4], [5, 6], [7, 8], [8, 10]]
>>> [i for l in ll for i in l]
[1, 2, 3, 4, 5, 6, 7, 8, 8, 10]