Ho scritto una semplice ricerca in profondità in Scala con una funzione ricorsiva del genere:Rompere o corto circuito una piega a Scala
search(labyrinth, path, goal)
dove labirinto è una specifica del problema (come grafico o qualsiasi altra cosa), percorso è una lista che contiene il percorso intrapreso finora e l'obiettivo è una specifica dello stato obiettivo. La funzione restituisce un percorso verso l'obiettivo come List e Nil se non è possibile trovare alcun percorso.
La funzione si espande, ad es. trova tutti i nodi successivi adatti (candidati) e quindi deve ricorsivamente chiamarsi.
Faccio questo
candidates.foldLeft(Nil){
(solution, next) =>
if(solution == Nil)
search(labyrinth, next :: path, goal)
else
solution
}
prega di notare che ho omesso alcuni particolari unescessary. Tutto sta funzionando bene finora. Ma una volta trovata una soluzione all'interno della chiamata foldLeft, questa soluzione viene semplicemente copiata dalla parte else dell'istruzione if. C'è un modo per evitare questo rompendo la piega sinistra o forse utilizzando una funzione diversa invece di foldLeft? In realtà probabilmente potrei scrivere una versione di foldLeft che si interrompe una volta che "not Nil" viene restituito da solo. Ma ce n'è uno all'interno dell'API?
Cosa stai cercando di evitare esattamente? Non c'è copia da nessuna parte. – Apocalisp
non sta andando a sostenere almeno una chiamata di funzione per ogni articolo rimanente nell'elenco? –
Con foldLeft, sì. Ma, ancora una volta, foldLeft si sta piegando per fare qualcosa a cui non era destinato. –