Я написал простой поиск по глубине в Scala с такой рекурсивной функцией:
search(labyrinth, path, goal)
где лабиринт - это спецификация проблемы (как граф или что-то еще), путь - это список, который содержит путь, принятый до сих пор, а цель - спецификация состояния цели. Функция возвращает путь к цели как List и Nil, если путь не найден.
Функция расширяется, например. находит все подходящие следующие узлы (кандидаты), а затем должен рекурсивно называть себя.
Я делаю это с помощью
candidates.foldLeft(Nil){
(solution, next) =>
if( solution == Nil )
search( labyrinth, next :: path, goal )
else
solution
}
Обратите внимание, что я пропустил некоторые ненужные данные. Пока все работает нормально. Но как только решение найдено внутри вызова foldLeft, это решение просто копируется другой частью if-statement. Есть ли способ избежать этого, разбив foldLeft или, возможно, используя другую функцию вместо foldLeft? На самом деле я, вероятно, мог бы написать версию foldLeft, которая ломается один раз "не нил" возвращается сам. Но есть ли внутри API?