ich geschrieben habe eine einfache Tiefensuche in Scala mit einer rekursiven Funktion wie folgt aus:eine Falte in Scala
search(labyrinth, path, goal)
wo Labyrinth ist eine Spezifikation des Problems (als Grafik oder was auch immer), Pfad ist eine Liste, die den bisherigen Pfad enthält und Ziel ist eine Spezifikation des Zielzustands. Die Funktion gibt einen Pfad zum Ziel als List und Nil zurück, wenn kein Pfad gefunden werden kann.
Die Funktion expandiert z.B. findet alle geeigneten nächsten Knoten (Kandidaten) und muss sich dann rekursiv selbst nennen.
ich tun dies, indem
candidates.foldLeft(Nil){
(solution, next) =>
if(solution == Nil)
search(labyrinth, next :: path, goal)
else
solution
}
Bitte beachten Sie, dass ich einige unescessary Details weggelassen. Bis jetzt funktioniert alles gut. Wenn jedoch innerhalb des Aufrufs von foldLeft eine Lösung gefunden wird, wird diese Lösung einfach durch den else-Teil der if-Anweisung kopiert. Gibt es eine Möglichkeit, dies zu vermeiden, indem Sie das FoldLeft aufbrechen oder vielleicht eine andere Funktion anstelle von FoldLeft verwenden? Eigentlich könnte ich wohl eine Version von foldLeft schreiben, die bricht, sobald "not Nil" selbst zurückgegeben wird. Aber gibt es einen in der API?
Was möchten Sie genau vermeiden? Es wird nirgends kopiert. – Apocalisp
wird für jeden verbleibenden Eintrag in der Liste nicht mindestens ein Funktionsaufruf ausgelöst? –
Mit dem foldLeft, ja. Aber dann, foldLeft wird gebogen, um etwas zu tun, was nicht beabsichtigt war. –