算法 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.