Domanda

Sto usando troppo per il mio gusto il modello (dopo ogni possibile ramo della soluzione della ricerca).Questo è il codice per trovare parole Boggle in Dato Square.Aveva un bug se le parole non sono preselette per includere solo quelle le cui coppie di lettere sono vicini, che ho riparato ora cambiando la commissioni non POS per POS non è.

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
.

C'è un'alternativa migliore per rendere il generatore che si ferma dopo che qualsiasi risposta è stata trovata?

Soluzione basata sul perché non utilizzare il rendimento

Alla fine mi ha portato e restituito la sequenza è iteratore, non importa che fosse restituito non ha prodotto valore.Così ho cambiato il mio codice word_path per usare il ritorno e ripulire le espressioni in generale.Invece di dare nessuno o falso la funzione restituisce (false,).Quindi non ho problemi senza non accettato per la dichiarazione.

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

È stato utile?

Soluzione

Perché lo fai un generatore in primo luogo quando vuoi solo una risposta?Basta cercare risposte e restituire il primo invece di renderlo.

Altri suggerimenti

return iter([anwser])
.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top