古い、メンテナンスされていないWebページでアルゴリズムXのPython実装を見つけました。それは美しく動作します。コードは非常に簡潔で、コメントはありません。把握していないものが一枚あります。私はそれが機能することを知っていますが、その方法や理由はわかりません。私よりもPythonプログラマーの進歩を期待しています。
以下のコードでは「select」が呼び出されていますが、戻り値に何が起こっているのですか。さらに、「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
作者:Ali Assaf
変更可能なデータ型は、コピーではなく参照として渡されます。はい、X.pop()は元のXを変更します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加