算法 X Python 实现
Algorithm X Python Implementation
我在一个较旧的、未维护的网页上找到了 python 算法 X 的实现。它工作得很漂亮。代码非常简洁,没有注释。有一件我没有抓住。我知道它有效,但我不知道如何或为什么。希望比我更高级的 python 程序员能帮忙。
在下面的代码中,“select”被调用,但是 return 值发生了什么。此外,“select”是否会改变 X 内的值(即 X.pop(j))?传递给“select”的不是 X 的副本吗?
此代码:
X, Y = exact_cover(X, Y)
for i, row in enumerate(grid):
for j, n in enumerate(row):
if n:
select(X, Y, (i, j, n))
for solution in solve(X, Y, []):
for (r, c, n) in solution:
grid[r][c] = n
yield grid
调用此函数:
def select(X, Y, r):
cols = []
for j in Y[r]:
for i in X[j]:
for k in Y[i]:
if k != j:
X[k].remove(i)
cols.append(X.pop(j))
return cols
来源:https://www.cs.mcgill.ca/~aassaf9/python/algorithm_x.html
作者:阿里·阿萨夫
可变数据类型作为引用而不是副本传递。是的 X.pop() 会改变原来的 X.
我在一个较旧的、未维护的网页上找到了 python 算法 X 的实现。它工作得很漂亮。代码非常简洁,没有注释。有一件我没有抓住。我知道它有效,但我不知道如何或为什么。希望比我更高级的 python 程序员能帮忙。
在下面的代码中,“select”被调用,但是 return 值发生了什么。此外,“select”是否会改变 X 内的值(即 X.pop(j))?传递给“select”的不是 X 的副本吗?
此代码:
X, Y = exact_cover(X, Y)
for i, row in enumerate(grid):
for j, n in enumerate(row):
if n:
select(X, Y, (i, j, n))
for solution in solve(X, Y, []):
for (r, c, n) in solution:
grid[r][c] = n
yield grid
调用此函数:
def select(X, Y, r):
cols = []
for j in Y[r]:
for i in X[j]:
for k in Y[i]:
if k != j:
X[k].remove(i)
cols.append(X.pop(j))
return cols
来源:https://www.cs.mcgill.ca/~aassaf9/python/algorithm_x.html
作者:阿里·阿萨夫
可变数据类型作为引用而不是副本传递。是的 X.pop() 会改变原来的 X.