Tôi mới sử dụng Clojure và tôi nghĩ rằng cách tiếp cận viết mã của tôi cho đến nay không phù hợp với "Way of Clojure". Ít nhất, tôi tiếp tục viết các hàm giữ cho dẫn đến lỗi StackOverflow với các giá trị lớn. Tôi đã học về cách sử dụng recur đã được một bước tiến tốt. Tuy nhiên, làm thế nào để thực hiện các chức năng như một chức năng dưới đây cho các giá trị như 2500000?Làm cách nào để viết chức năng Clojure này để nó không thổi tung ngăn xếp?
(defn fib [i]
(if (>= 2 i)
1
(+ (fib (dec i))
(fib (- i 2)))))
Chức năng là, đối với mắt tôi, việc triển khai "đồng bằng" của trình tạo Fibonacci. Tôi đã thấy các triển khai khác được tối ưu hóa nhiều hơn, nhưng ít rõ ràng hơn về những gì họ thực hiện. I E. khi bạn đọc định nghĩa hàm, bạn không đi "oh, fibonacci".
Mọi con trỏ sẽ được đánh giá cao!
Cảm ơn bạn! Tôi sẽ suy nghĩ về điều này. :) – bitops
Hey, chỉ muốn quay lại và yêu cầu trợ giúp: nếu tôi chuyển các giá trị lớn hơn 92 cho hàm của bạn, tôi sẽ gặp lỗi. ArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1374) Tôi có thiếu gì đó không? – bitops
Và chỉ để rõ ràng, tôi vẫn thích câu trả lời của bạn. :) – bitops