Peter Norvig は、決定論的な論理演算と可能な解決策のスマートなトラバーサルを組み合わせることで、最も難しい数独パズルを解くプログラムについて説明したエッセイを書いています。後者は再帰的に行われます。これがその関数です(source):
def search(values):
"Using depth-first search and propagation, try all possible values."
if values is False:
return False ## Failed earlier
if all( len( values[s]) == 1 for s in squares):
return values ## Solved!
## Chose the unfilled square s with the fewest possibilities
_,s = min( (len( values[s]), s)
for s in squares
if len(values[s]) > 1
)
return some( search( assign( values.copy(), s, d))
for d in values[s]
)
(見やすくするために、いくつかのスペース、CR、およびタブを追加しました。Norvig 博士に謝罪します。)
コメントのすぐ下に " _,s
" で始まる行があります。len(values[s]),s
それは、 の最小値を持つ展開されたタプル ( ) のようですs
。Dr. Norvig_
は変数名として " " を使用して、それが「どうでもいい」結果であることを示しているだけですか、それとも何か他のことが起こっているのでしょうか? _
変数名として「 」が推奨される場合はありますか? 対話モードでは、" _
" は前の操作の答えを保持します。非対話型コードに同様の機能はありますか?
アップデート
良い答えをありがとう。The Answer は、「付加価値」のために Alex Martelli に行くと思います。彼は、"_, vbl_of_interest" イディオムは DSU イディオムの副作用であることが多く、DSU イディオム自体はほとんど不要になっていると指摘しています。