Pregunta

Estoy usando demasiado para mi gusto el patrón (después de cada rama de solución posible de la búsqueda).Este es el código para encontrar palabras en boggle en cuadrado dado.Tenía un error si las palabras no están preseleccionadas para incluir solo a aquellas cuyas parejas de letras son vecinos, lo que arreglé ahora cambiando a la Comarision, no POS para POS es NINGUNA.

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

¿Hay una mejor alternativa para hacer generador que se detiene después de que se encontró una respuesta?

Solución basada en por qué no usar la devolución

Finalmente, me consiguió y la secuencia devuelta es iteradora, sin importar que se haya devuelto, no se haya dado valor.Así que cambié mi código de Word_Path para usar la devolución y limpié las expresiones en general.En lugar de no dar ninguna o falsa, la función vuelve (false,).Luego, no tengo ningún problema con ninguno, no aceptado para la declaración.

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

¿Fue útil?

Solución

¿Por qué lo convierte en un generador en primer lugar cuando solo quieres una respuesta?Solo busque respuestas y devuelva el primero en lugar de cederlo.

Otros consejos

return iter([anwser])
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top