Tôi đã viết một tìm kiếm theo chiều sâu đơn giản trong Scala với một hàm đệ quy như thế:Phá vỡ hoặc shortcircuit một lần trong Scala
search(labyrinth, path, goal)
nơi mê cung là một đặc điểm kỹ thuật của vấn đề (như biểu đồ hoặc bất cứ điều gì), đường dẫn là một danh sách giữ đường dẫn được thực hiện cho đến nay và mục tiêu là một đặc tả của trạng thái mục tiêu. Hàm trả về một đường dẫn tới mục tiêu dưới dạng một Danh sách và Nil nếu không tìm thấy đường dẫn nào.
Hàm mở rộng, ví dụ: tìm thấy tất cả các nút tiếp theo phù hợp (ứng cử viên) và sau đó phải gọi đệ quy gọi chính nó.
Tôi làm điều này bằng
candidates.foldLeft(Nil){
(solution, next) =>
if(solution == Nil)
search(labyrinth, next :: path, goal)
else
solution
}
Xin lưu ý rằng tôi đã bỏ qua một số chi tiết unescessary. Tất cả mọi thứ đang làm việc tốt cho đến nay. Nhưng khi một giải pháp được tìm thấy bên trong cuộc gọi foldLeft, giải pháp này sẽ được sao chép đơn giản bởi phần khác của câu lệnh if. Có cách nào để tránh điều này bằng cách phá vỡ foldLeft hoặc có thể bằng cách sử dụng một chức năng khác thay vì foldLeft? Trên thực tế tôi có thể có thể viết một phiên bản của foldLeft mà phá vỡ một lần "không Nil" được trả lại bản thân mình. Nhưng có một bên trong API?
Bạn đang cố gắng tránh chính xác điều gì? Không có sao chép nào xảy ra ở bất cứ đâu. – Apocalisp
không phải là s/anh ta sẽ phải chịu ít nhất một cuộc gọi hàm cho mỗi mục còn lại trong danh sách? –
Với foldLeft, vâng. Nhưng, sau đó một lần nữa, foldLeft đang được uốn cong để làm một cái gì đó nó đã không được dự định. –