我想从递归函数(下面的代码)中得到结果,但是很难让输出与我想要的匹配。理想情况下,如果我打电话
print(list(n_queens_solutions(4)))
我会看到的
[[1, 3, 0, 2], [2, 0, 3, 1]]
但是函数返回
[[], []]
我不太熟悉Python生成器;我尝试过各种“yield”和“return”的排列,但都没有用。你知道吗
def n_queens_valid(board):
for q1 in range(len(board)):
for q2 in range (1, len(board)-q1):
if board[q1] == board[q1+q2] or board[q1+q2] == board[q1]+q2 or board[q1+q2] == board[q1]-q2:
return False
return True
def n_queens_solutions(n):
board = []
return n_queens_helper(0, board, n)
def n_queens_helper(n, board, size):
if len(board) == size:
print(board)
yield board
else:
for i in range(size):
board.append(i)
if n_queens_valid(board):
yield from n_queens_helper(n+1, board, size)
board.pop()
print(list(n_queens_solutions(4)))
上面代码中最后一行的打印应该输出:[[1,3,0,2],[2,0,3,1]],但是返回[[],[]。你知道吗
是的,您需要学习有关生成器的教程,以便更全面地了解它们的工作原理。您目前面临的问题是
n_queens_solutions
只调用helper
函数一次,即第一个分支找不到解决方案,并且显示失败时返回的空板。你知道吗简单地说,把生成器看作是一个带有书签的函数。当您调用生成器时,它将一直执行,直到到达第一个
yield
;它返回该值,但保留其所有状态信息:所有变量值、它在代码中的位置等。当您再次调用它时,它将从该点重新启动并继续,直到到达下一个yield
,并以这种方式继续,直到它从代码末尾脱落密码。你知道吗生成器最简单的用途是作为迭代器:
您已经以这种方式使用了它(通过在主程序中构建解决方案列表)和重复部分解决方案(使用
yield from
),但是您需要在控制流上做更多的工作。尝试插入跟踪语句:现在观察执行的进展。你知道吗
让我们用一个简单的例子来说明发生了什么:
输出:
list(result)
),我们运行生成器直到它到达函数的末尾,将所有yield
结果放入列表中output.clear()
方法也已执行。你知道吗result
变量的内容与生成器函数末尾的output
变量的内容匹配为了防止这种行为,一个简单的解决方案是返回一个我们正在返回的值的副本,这样我们以后就可以对它进行操作:
yield output[:]
(不过这是一个浅拷贝)相关问题 更多 >
编程相关推荐