你能解释一下 Norvig 的数独代码中的 assign 函数吗?
Can you explain the assign function in Norvig's Sudoku code?
我有 Peter Norvig 在他的数独解算器中使用的这段 Python 代码。我不明白为什么 assign 应该对 'values' 做任何事情,因为因为代码中没有任何地方 'values' 得到更新并且 'values' 仅在 if 条件语句中使用。能否请您解释一下,在此先感谢!
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,'')
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
for u in units[s]:
dplaces = [s for s in u if d in values[s]]
if len(dplaces) == 0:
return False ## Contradiction: no
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
values
更新为 eliminate
的副作用:
values[s] = values[s].replace(d,'')
这将从 values
的 s
条目中删除所有值 d
。参见 replace。
我有 Peter Norvig 在他的数独解算器中使用的这段 Python 代码。我不明白为什么 assign 应该对 'values' 做任何事情,因为因为代码中没有任何地方 'values' 得到更新并且 'values' 仅在 if 条件语句中使用。能否请您解释一下,在此先感谢!
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,'')
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
for u in units[s]:
dplaces = [s for s in u if d in values[s]]
if len(dplaces) == 0:
return False ## Contradiction: no
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
values
更新为 eliminate
的副作用:
values[s] = values[s].replace(d,'')
这将从 values
的 s
条目中删除所有值 d
。参见 replace。