在组装一个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
为什么会发生这种情况?
需要明确的是,我并不是在寻找这个任务的解决方案,我已经用另一种方式解决了它,我只想了解在这种情况下发生了什么。
问题出在您分配给pre
的这一行上,覆盖了它以前的值:
prev_ind = [j for (pre, j) in seen] # <---mystery culprit
试着把它改成这个,它应该会像你期望的那样工作:
prev_ind = [j for (pre2, j) in seen]