【问题标题】:Recursion help - Peter Norvig's Sudoku exercise递归帮助 - Peter Norvig 的数独练习
【发布时间】: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


    【解决方案1】:

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

    这个例子展示了一个反模式:你不应该同时改变一个参数返回它。例如,所有更改 listappendpop 等)的方法返回原始列表。

    eliminate 函数与assign 函数中的 相同 dict,并且 assign 函数中的任何更改都会反映在 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
    

    【讨论】:

    • 我明白了。所以即使字典不是全局对象,这也是行为?
    • @AdrianPrayoga 是的。 Python args 通过赋值传递。 This answer 可能会更好地解释它。
    猜你喜欢
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 2015-03-01
    • 1970-01-01
    • 2012-07-02
    相关资源
    最近更新 更多