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
。Norvig 博士是否使用“ _
”作为变量名只是为了表明它是“无关紧要”的结果,还是发生了其他事情?是否有时_
建议将“”作为变量名?在交互模式下,“ _
”保存前一个操作的答案;非交互式代码中是否有类似的功能?
更新
谢谢你的好答案。我想答案是亚历克斯·马泰利(Alex Martelli)的“增值”;他指出,“_, vbl_of_interest”习语通常是 DSU 习语的副作用,而这本身在很大程度上是不必要的。