【发布时间】:2012-07-17 21:34:43
【问题描述】:
在组装 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、start 等)?
-
另外,为什么你在代码中描述的不是
previous_ind行?它在代码中的什么位置?我确定该行实际上并没有影响i的值。 -
@DavidRobinson 它在代码中,在 find_bwords 的第 3 行注释掉