こんにちは、私は現在、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 values
がeliminate
関数で更新されていることです(そしてコードを実行した後、これが当てはまると思います)。ただし、これはassign
関数の外部で行われ、assign関数内のvalues
には影響しません。これは、関数内で直接更新されないためです。
多分あなたは私に光の小屋を与えることができますか?
私が参照してください。これは辞書がグローバルオブジェクトでなくても動作しますか? –
@ AdrianPrayogaはい。 Pythonのargsは代入によって渡されます。 [この回答](https://stackoverflow.com/a/986145/5754656)より良い説明があります。 – Artyer
ありがとうございます。 –