【发布时间】:2013-09-29 08:01:16
【问题描述】:
这是来自 https://wiki.python.org/moin/SimplePrograms 的 8 个皇后问题的递归解决方案。我很难理解解决函数中的 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)。
有没有人有一个很好的方法来解释这个语法是如何工作的,或者我可以学习其他可以帮助我理解它的例子?这真的勾起了我的好奇心……
【问题讨论】:
-
@DanielRoseman:这不是无效的语法。这是一个复杂的列表生成器内部
-
return只是一个分成多行的列表理解,可能是为了“可读性”。 -
@justhalf 是的,刚刚注意到。
-
IMO 这是 Python wiki 上一个非常可怕的例子,而不是你在真正的 Python 编程中做过的事情。