0

我使用了太多不符合我口味的模式(在搜索的每个可能的解决方案分支之后)。这是在给定方块中查找单词的代码。如果没有预先选择单词以仅包括其字母对是邻居的单词,则会出现错误,我现在通过将比较 not pos 更改为 pos is None 来解决这个问题。

def word_path(word,used=[],pos=None):
    if not word:
        yield False
        return
    else:
        correct_neighbour = [neigh for p,neigh in neighbour_set
                  if (not pos or pos==p) and (neigh not in used) and boggle[neigh]==word[0] ]
        for i in correct_neighbour:
            used_copy=used[:]+[i]
            if boggle[i]==word:
                yield used_copy
                return
            else:
                for solution in  word_path(word[1:],used_copy,pos=i) or (False,):
                    if solution:
                        yield solution
                    return

有没有更好的替代方法可以让生成器在找到任何答案后停止?

基于为什么不使用return的解决方案

最后它得到了我并且返回的序列是迭代器,无论它返回没有产生值。所以我更改了我的 word_path 代码以使用 return 并通常清理表达式。函数返回 (False,),而不是给出 None 或 False。然后我对 None 不接受 for 声明没有问题。

def word_path(word,used=[],pos=None):
if word:
    correct_neighbour = [neigh
                         for p,neigh in neighbour_set
                         if ((pos is None or pos==p) and
                             (neigh not in used) and
                             boggle[neigh]==word[0]
                             )
                         ]
    for i in correct_neighbour:
        used_copy=used[:]+[i]
        if len(word)==1:
            if boggle[i]==word:
                return (used_copy,)
        else:
            for solution in  word_path(word[1:],used_copy,pos=i):
                if solution:
                    return (solution,)
return (False,)
4

2 回答 2

3

当您只想要一个答案时,为什么首先要使其成为生成器?只需搜索答案并返回第一个而不是产生它。

于 2010-07-24T13:56:07.867 回答
1
return iter([anwser])
于 2010-07-24T13:20:29.557 回答