2017-06-24 7 views
0

こんにちは、私は現在、Peter Norvigのsudoku解(http://norvig.com/sudoku.html)に行きます。再帰ヘルプ - Peter Norvigの数独エクササイズ

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 valueseliminate関数で更新されていることです(そしてコードを実行した後、これが当てはまると思います)。ただし、これはassign関数の外部で行われ、assign関数内のvaluesには影響しません。これは、関数内で直接更新されないためです。

多分あなたは私に光の小屋を与えることができますか?

答えて

0

Python dictは変更可能です。つまり、値を変更することができます。

この例では、アンチパターンを示しています。引数を両方とも返すべきではありません。例は、listappend,popなど)を変更するすべてのメソッドです元のリストを返します。

eliminate関数は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 
+0

私が参照してください。これは辞書がグローバルオブジェクトでなくても動作しますか? –

+0

@ AdrianPrayogaはい。 Pythonのargsは代入によって渡されます。 [この回答](https://stackoverflow.com/a/986145/5754656)より良い説明があります。 – Artyer

+0

ありがとうございます。 –

関連する問題