作为新手clojurian,它是recommended to me,我通过Project Euler问题作为学习语言的一种方式。它绝对是一种提高技能和获得信心的好方法。我刚刚完成了我对problem #14的回答。它工作正常,但为了让它高效运行,我不得不实施一些记忆。我无法使用预先包装好的memoize
函数,因为我的代码的结构是这样的,我认为这是一个很好的体验,可以推出自己的代码。我的问题是,如果有一种很好的方法来将我的缓存封装在函数本身中,或者我必须像我这样定义一个外部缓存。此外,任何提示,使我的代码更习惯性将不胜感激。项目欧拉#14和在Clojure memoization
(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))))
只是想感谢你让我看到项目欧拉。我也在努力学习clojure。 – 2011-03-07 21:23:31
非常小的一点,但(inc c)可能比(+ 1 c)更具惯用性。 – 2011-07-20 17:43:54