0

私は自分の好みのパターンを使いすぎています(検索のすべての可能なソリューションブランチの後)。これは、指定された正方形でボグル ワードを検索するコードです。文字のペアが隣接する単語のみを含むように単語が事前に選択されていない場合、バグがありました。これは、comparsion 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 を使用するように変更し、一般的に式をクリーンアップしました。None または False を指定する代わりに、関数は (False,) を返します。それから、None not accept for 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

答えが1つしかないのに、そもそもなぜジェネレーターにするのですか?答えを検索して、最初の答えを返すのではなく、返すだけです。

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