Tôi mới làm quen với lập trình hàm, do đó một số vấn đề có vẻ khó giải quyết hơn bằng cách sử dụng phương pháp chức năng.Mang theo thông tin về các tính toán trước
Giả sử tôi có danh sách các số, như 1 đến 10.000 và tôi muốn lấy các mục trong danh sách tổng cộng tối đa một số n (giả sử 100). Vì vậy, nó sẽ lấy các con số cho đến khi tổng của chúng lớn hơn 100.
Trong lập trình bắt buộc, nó là tầm thường để giải quyết vấn đề này, vì tôi có thể giữ một biến trong mỗi tương tác và dừng lại khi mục tiêu được đáp ứng.
Nhưng làm cách nào tôi có thể làm tương tự trong lập trình hàm? Vì hàm tổng hoạt động trên các danh sách đã hoàn thành, và tôi vẫn không có danh sách hoàn chỉnh, làm thế nào tôi có thể 'tiếp tục' tính toán?
Nếu tổng được lười biếng tính toán, tôi có thể viết một cái gì đó như thế:
(1 to 10000).sum.takeWhile(_ < 100)
PS: Mặc dù bất kỳ câu trả lời sẽ được đánh giá cao, tôi muốn một điều đó không có tính tổng mỗi lần, vì rõ ràng là phiên bản bắt buộc sẽ tối ưu hơn nhiều về tốc độ.
Chỉnh sửa:
Tôi biết rằng tôi có thể "chuyển đổi" phương pháp tiếp cận vòng lặp bắt buộc thành chức năng đệ quy chức năng. Tôi quan tâm nhiều hơn trong việc tìm kiếm xem một trong những chức năng thư viện hiện có có thể cung cấp một cách để tôi không viết một lần mỗi khi tôi cần thứ gì đó không.
Có lẽ dễ nhất để sử dụng bộ tích lũy biến. '{var sum = 0; (1 đến 10000) takeWhile {i => sum + = i; tổng <100}} '. Không có gì sai với việc có 'var' ở đây; nó không thể thoát được bởi vì biểu thức có '{}' xung quanh nó. –
Tại sao bạn nghĩ rằng viết một hàm "mỗi khi bạn cần một cái gì đó" là ít tự nhiên hơn viết một vòng lặp bắt buộc mỗi khi bạn cần một cái gì đó? – Ben