2010-07-24 9 views
0

J'utilise trop à mon goût le motif (après chaque branche de solution possible de la recherche). C'est le code pour trouver des mots boggle dans le carré donné. Il y avait un bug si les mots n'étaient pas présélectionnés pour n'inclure que ceux dont les paires de lettres sont des voisins, que j'ai corrigé maintenant en changeant la comparrision non pos à pos est None. Y a-t-il une meilleure alternative pour faire un générateur qui s'arrête après avoir trouvé une réponse?Arrêter le générateur en première réponse, utiliser retour à la place

Solution basée sur pourquoi ne pas utiliser le retour

Enfin, il m'a retourné et la séquence est iterator, peu importe qu'elle était retournée valeur pas donné. J'ai donc changé mon code word_path pour utiliser return et nettoyer les expressions en général. Au lieu de donner None ou False, la fonction renvoie (False,). Ensuite, je n'ai pas de problème avec None pas accepté pour la déclaration.

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,) 
+0

duplication possible de [Rendement jusqu'à ce que toutes les valeurs nécessaires soient atteintes] (http://stackoverflow.com/questions/3324947/yielding-until-all-needed-values-are-yielded) –

+0

@ S.Lott: It isn 't un duplicata. Cette question veut arrêter de produire à un moment donné, alors que le prétendu duplicata veut que l'appelant arrête le générateur lorsqu'il veut arrêter de consommer. –

+1

Je ne suis pas sûr de comprendre votre problème. Bien que pas tout à fait commun, il est parfaitement normal et OK de revenir immédiatement après un rendement pour signaler qu'il n'y a plus de valeurs à venir. –

Répondre

3

Pourquoi faites-vous un générateur en premier lieu quand vous voulez qu'une seule réponse? Recherchez simplement les réponses et renvoyez la première au lieu de la céder.

1
return iter([anwser])