在整理一个Boggle求解器时,我遇到了一些奇怪的行为,我希望有人可以向我解释。我得到了一个函数来返回一组可能的单词,而我似乎缺少的是一种防止求解器包含通过在游戏中两次访问同一个正方形而创建的单词的方法。我尝试通过迭代使用的全局变量seen
(我知道这不正确)来创建当前播放中已访问过的正方形列表(表示电路板的字符串中的索引号列表)记住以前探索过的路径。但是,只需使用以下命令初始化具有这些值的变量:
previous_ind = [j for (pre, j) in seen]
在递归函数find_bwords
中,以某种方式影响索引变量i
并导致源自find_bwords中最后一行的IndexErrors。
seen = set() #(prefix, index) pairs
def boggle_words(board, minlength=3):
"Find all the words on this Boggle board; return as a set of words."
results = set()
for i, sq in enumerate(board):
if is_letter(sq):
find_bwords(board, sq, i, results, minlength)
return results
def find_bwords(board, pre, start, results, minlength): #adds to seen and results
global seen
#prev_ind = [j for (pre, j) in seen] <---mystery culprit
if (pre, start) not in seen:
seen.add((pre, start))
if len(pre) >= minlength and pre in WORDS:
results.add(pre)
if pre in PREFIXES:
for i in neighbors(start, int(sqrt(len(board)))):
#print 'index: ', i
find_bwords(board, pre+board[i], i, results, minlength)
在介绍prev_ind
之前,这是索引打印输出的一部分:
index: 0
index: 1
index: 2
index: 6
index: 8
index: 12
index: 13
index: 14
index: 1
index: 2
以下是以下部分:
index: 0
index: -7
index: -14
index: -21
index: -28
index: -35
index: -42
为什么会这样?
要说清楚,我不是在寻找这个任务的解决方案,我已经用另一种方式解决了,我只想了解这个实例中发生了什么。
答案 0 :(得分:4)
问题在于您分配给pre
的这一行,覆盖了之前的值:
prev_ind = [j for (pre, j) in seen] # <---mystery culprit
尝试将其更改为此,它应该按预期工作:
prev_ind = [j for (pre2, j) in seen]