递归帮助 - 彼得诺维格的数独运动

时间:2017-06-24 17:12:52

标签: python python-3.x recursion

您好我正在浏览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,因为它不会直接在函数中更新。

也许你们可以给我一个光明之处?

1 个答案:

答案 0 :(得分:0)

Python dict是可变的,这意味着它们的值可以改变。

这个例子显示了反模式:你不应该改变参数来返回它。一个示例是更改listappendpop等)的所有方法。 don&#t; 返回原始列表。

eliminate函数获取与assign函数中的相同的 dict,并且赋值函数中的任何更改都会反映在elimate函数中。

以下是一个例子:

def update(dict_, key, value):
    dict_[key] = value

d = {
    1: 2,
    3: 4
}
update(d, 1, 100)
update(d, 3, 100)

print(d[1] + d[3])  # 200