NapisaĹ,em prosty przeszukiwanie w głąb w Scala z funkcji rekurencyjnej tak:przerwa lub zwarcie fałdę w Scala
search(labyrinth, path, goal)
gdzie labiryntowe jest określenie problemów (wykres czy inne), ścieżka to lista, która zawiera dotychczasową ścieżkę, a celem jest określenie stanu celu. Funkcja zwraca ścieżkę do celu jako listę i zero, jeśli nie można znaleźć żadnej ścieżki.
Funkcja zostanie rozwinięta, np. znajduje wszystkie odpowiednie następne węzły (kandydatów), a następnie musi rekurencyjnie nazywać siebie.
zrobić to przez
candidates.foldLeft(Nil){
(solution, next) =>
if(solution == Nil)
search(labyrinth, next :: path, goal)
else
solution
}
Należy pamiętać, że pominięto kilka unescessary szczegóły. Wszystko do tej pory działa dobrze. Ale gdy rozwiązanie znajdzie się w wywołaniu foldLeft, to rozwiązanie zostanie po prostu skopiowane przez część else instrukcji if. Czy istnieje sposób na uniknięcie tego przez złamanie foldLeft, a może za pomocą innej funkcji zamiast foldLeft? Właściwie mógłbym prawdopodobnie napisać wersję foldLeft, która zrywa się, gdy sam "not Nil" zostanie zwrócony. Ale czy jest tam jeden interfejs API?
Czego dokładnie chcesz uniknąć? Nigdzie nie ma kopiowania. – Apocalisp
Czy nie wywoła co najmniej wywołania funkcji dla każdego pozostałego elementu na liście? –
Z foldLeft, tak. Ale, znowu, foldLeft jest skłonny do zrobienia czegoś, na co nie ma zamiaru. –