我已经开始使用Clojure进行Project Euler,这是学习Clojure的第一次尝试.我已经解决了第一个任务:
求出1000以下3或5的所有倍数的总和.
我以前用Python解决了它:
sum(i for i in xrange(1000) if i%3==0 or i%5==0)
Run Code Online (Sandbox Code Playgroud)
这是我的第一次Clojure尝试:
(reduce +
(filter
(fn [x]
(or
(= 0 (mod x 3))
(= 0 (mod x 5))))
(range 1000)))
Run Code Online (Sandbox Code Playgroud)
我真的很惊讶它有多详细,但我很确定这是因为我的风格和对Clojure成语的无知.
这个Clojure代码的惯用版本会是什么样的?
我就这样做了:
(apply +
(filter #(or (zero? (mod % 3))
(zero? (mod % 5)))
(range 1000)))
Run Code Online (Sandbox Code Playgroud)
是什么让我的解决方案稍微更惯用于使用匿名函数阅读器宏,#(...)以及zero? fn
你的解决方案不同但同样好!
顺便说一句 - 解决欧拉问题是学习一门新语言的好方法 - 你无法从一本书中获得所有东西.
编辑:
我决定提供一个更符合你的Python版本的不同解决方案(不是很漂亮的IMO)
(apply +
(for [i (range 1000) :when (or (zero? (mod i 3))
(zero? (mod i 5)))]
i))
Run Code Online (Sandbox Code Playgroud)
只是另一个版本:
(defn sum-of [n]
(reduce + (range n 1000 n)))
(+ (sum-of 3) (sum-of 5) (- (sum-of 15)))
Run Code Online (Sandbox Code Playgroud)