【发布时间】:2017-11-28 01:37:28
【问题描述】:
您好,我目前正在研究 Peter Norvig 的数独解决方案 (http://norvig.com/sudoku.html)。
但是,我对下面的代码块有点困惑:
def assign(values, s, d):
"""Eliminate all the other values (except d) from values[s] and propagate.
Return values, except return False if a contradiction is detected."""
other_values = values[s].replace(d, '')
if all(eliminate(values, s, d2) for d2 in other_values):
return values
else:
return False
def eliminate(values, s, d):
"""Eliminate d from values[s]; propagate when values or places <= 2.
Return values, except return False if a contradiction is detected."""
if d not in values[s]:
return values ## Already eliminated
values[s] = values[s].replace(d,'')
## (1) If a square s is reduced to one value d2, then eliminate d2 from the peers.
if len(values[s]) == 0:
return False ## Contradiction: removed last value
elif len(values[s]) == 1:
d2 = values[s]
if not all(eliminate(values, s2, d2) for s2 in peers[s]):
return False
## (2) If a unit u is reduced to only one place for a value d, then put it there.
for u in units[s]:
dplaces = [s for s in u if d in values[s]]
if len(dplaces) == 0:
return False ## Contradiction: no place for this value
elif len(dplaces) == 1:
# d can only be in one place in unit; assign it there
if not assign(values, dplaces[0], d):
return False
return values
函数assign 接收字典values 的输入,如果没有矛盾,也会返回values。但是,在assign 函数中,我没有看到字典values 的任何更新。我的理解是 dict values 是用 eliminate 函数更新的(在运行代码之后,我相信是这种情况)。但是,这是在 assign 函数之外完成的,并且不应影响 assign 函数中的 values,因为它不会在函数中直接更新。
也许你们能给我一点启示?
【问题讨论】:
标签: python python-3.x recursion