在组装 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
为什么会这样?
需要明确的是,我不是在寻找这个任务的解决方案,我已经以另一种方式解决了它,我只是想了解在这种情况下发生了什么。