Là một thuật ngữ tân tiến, đó là recommended to me mà tôi xem xét các vấn đề về Project Euler như một cách để học ngôn ngữ. Nó chắc chắn là một cách tuyệt vời để cải thiện kỹ năng của bạn và đạt được sự tự tin. Tôi vừa hoàn thành câu trả lời của mình cho problem #14. Nó hoạt động tốt, nhưng để có được nó chạy hiệu quả tôi đã phải thực hiện một số memoization. Tôi không thể sử dụng chức năng được đóng gói sẵn memoize
vì cách mã của tôi được cấu trúc và tôi nghĩ đó là một trải nghiệm tốt để cuộn theo cách của riêng tôi. Câu hỏi của tôi là nếu có một cách tốt để đóng gói bộ nhớ cache của tôi trong chính hàm đó, hoặc nếu tôi phải định nghĩa một bộ đệm ẩn bên ngoài như tôi đã làm. Ngoài ra, bất kỳ lời khuyên nào để làm cho mã của tôi thành ngữ hơn sẽ được đánh giá cao.Dự án Euler # 14 và ghi nhớ trong Clojure
(use 'clojure.test)
(def mem (atom {}))
(with-test
(defn chain-length
([x] (chain-length x x 0))
([start-val x c]
(if-let [e (last(find @mem x))]
(let [ret (+ c e)]
(swap! mem assoc start-val ret)
ret)
(if (<= x 1)
(let [ret (+ c 1)]
(swap! mem assoc start-val ret)
ret)
(if (even? x)
(recur start-val (/ x 2) (+ c 1))
(recur start-val (+ 1 (* x 3)) (+ c 1)))))))
(is (= 10 (chain-length 13))))
(with-test
(defn longest-chain
([] (longest-chain 2 0 0))
([c max start-num]
(if (>= c 1000000)
start-num
(let [l (chain-length c)]
(if (> l max)
(recur (+ 1 c) l c)
(recur (+ 1 c) max start-num))))))
(is (= 837799 (longest-chain))))
Chỉ muốn cảm ơn bạn vì đã phơi bày tôi với dự án euler. Tôi cũng đang cố gắng học clojure. –
Điểm cực kỳ nhỏ, nhưng (inc c) có lẽ là thành ngữ hơn (+ 1 c). –