所以我正在阅读Peter Norvig Solving Every Sudoku Puzzle,同时他说他通过调用函数assign更新了值。如果没有对变量值进行赋值,我无法理解函数赋值如何更新变量值。值是通过引用assign函数传递的。
以下是相关代码:
def parse_grid(grid):
"""Convert grid to a dict of possible values, {square: digits}, or
return False if a contradiction is detected."""
## To start, every square can be any digit; then assign values from the grid.
values = dict((s, digits) for s in squares)
for s,d in grid_values(grid).items():
if d in digits and not assign(values, s, d):
return False ## (Fail if we can't assign d to square s.)
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
谢谢!
答案 0 :(得分:0)
assign()
通过探索其后果来执行将数字分配给一个正方形:消除替代答案。所有修改都在eliminate()
中完成,您不会将其包含在您的代码段中。第一步(在检查是否需要做任何事情之后)是从位置d
消除值s
:
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,'')
...
您正在寻找的任务。对d2
移交给assign()
的每个eliminate()
执行此操作。 (然后eliminate()
以递归方式调用自身,以删除更多值)。因此,没有批发替代字典,但其内容逐一修改。
参数在python中通过引用传递,因此所有这些调用都操纵相同的字典。新词典仅在search()
中创建,并显式调用values.copy()
。 assign()
和eliminate()
都会返回对它们所给出的相同字典对象的引用(当然,除非它们返回False
)。事实上,据我所知,eliminate()
也可能返回True/False
,因为它的返回值只能以布尔方式检查;调用者已经可以访问传入的字典。