2012-07-17 54 views
1

虽然把一个Boggle解算器放在一起,但我遇到了一些奇怪的行为,我希望有人能向我解释。我得到了返回一组可能的单词的功能,而我似乎缺少的一种方法是防止解算者在剧本中包含两次访问同一方格创建的单词。我尝试通过遍历全局变量seen(我知道这将是不正确的)来创建当前播放中已经访问过的正方形的列表(在表示该板的字符串内的索引号列表),该全局变量用于先前探索的路径。然而,简单地初始化变量使用那些值:简单地初始化一个变量的错误?

previous_ind = [j for (pre, j) in seen] 

递归函数find_bwords内,以某种方式影响索引变量i并导致IndexErrors从find_bwords最后一行而产生。

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

灿你粘贴异常的追踪?理想情况下,你能提供一个可重复的例子(即,一个板,预,开始等)? – 2012-07-17 21:38:44

+0

另外,为什么不在代码中描述的'previous_ind'行?代码位于哪里?我相信这条线实际上并没有影响'我'的价值。 – 2012-07-17 21:41:09

+0

@DavidRobinson它在代码中,在find_bwords中的第3行注释掉了 – 2012-07-17 21:45:52

回答

4

的问题是在这条线,你要分配到pre,覆盖以前的值它有:

prev_ind = [j for (pre, j) in seen] # <---mystery culprit 

尝试将其更改为这一点,它应该工作,你希望:

prev_ind = [j for (pre2, j) in seen] 
+1

打了我两秒钟+1。 Python避免引入新的范围来提高速度,但有时候它可能不直观。 – 2012-07-17 21:45:25

+0

我知道它会是简单的... – 2012-07-17 21:46:36

+1

在Python 3中它是固定的:这种意外的行为不再发生。 – 2012-07-17 21:49:56