【发布时间】:2020-04-05 23:22:09
【问题描述】:
这是 n-queen 问题的解决方案。在递归调用中,它传递修改后的列表。我的问题是对于每个递归调用,它是否会创建三个新列表:queens、xy_dif、xy_sum 并将它们保留在调用堆栈中?或者只有这三个列表,每个递归调用都只是修改了它们?如果是这样的话,我不明白它是如何解决如下问题的:
DFS([],[],[]) 调用 DFS([0], [0], [0]),然后 DFS([0], [0], [0]) 调用 DFS([0] ,2],[0,-1],[0,3]),它没有通过 if 条件所以它返回。
然后for循环继续,q=3,我的问题是为什么下一个调用是DFS([0,3],[0,-2],[0,4])而不是DFS([0,2 ,3],[0,-1,-2],[0,3,4])?
调用 DFS([0], [0], [0]) 后,这三个列表是如何恢复到原始状态的?
def solveNQueens(self, n):
def DFS(queens, xy_dif, xy_sum):
print('call function DFS({},{},{})'.format(queens, xy_dif, xy_sum))
p = len(queens)
print('updated row p is ', p)
if p==n:
result.append(queens)
print('p==n, result is ', result)
return None
for q in range(n):
print('loop starts, q is ', q)
if q not in queens and p-q not in xy_dif and p+q not in xy_sum:
DFS(queens+[q], xy_dif+[p-q], xy_sum+[p+q])
result = []
DFS([],[],[])
return [ ["."*i + "Q" + "."*(n-i-1) for i in sol] for sol in result]
【问题讨论】:
-
queens+[q]以及递归调用的其他两个参数正在构建新列表。它们引用与原始列表相同的项目(如果项目是可变的,例如子列表,这将是相关的),但不以其他方式连接到原始列表。 -
是的,这确实与递归无关,它与串联运算符的语义有关,
+与列表对象。
标签: python backtracking n-queens