这是惯用的Clojure吗?
我开始使用Clojure开展Project Euler,作为学习Clojure的第一步。 我解决了第一项任务:
找到1000以下所有3或5的倍数之和。
我以前用Python解决过它:
sum(i for i in xrange(1000) if i%3==0 or i%5==0)
这是我第一次尝试Clojure:
(reduce +
(filter
(fn [x]
(or
(= 0 (mod x 3))
(= 0 (mod x 5))))
(range 1000)))
实际上,我对它的详细程度感到惊讶,但我很肯定这是因为我的风格和对Clojure成语的无知。
这个Clojure代码的惯用版本是什么样的?
这是我做到的:
(apply +
(filter #(or (zero? (mod % 3))
(zero? (mod % 5)))
(range 1000)))
是什么让我的解决方案稍微更习惯于使用匿名函数阅读器宏#(...)
和zero?
fn
你的解决方案是不同的,但同样好 !
顺便说一句 - 解决欧拉问题是学习一门新语言的好方法 - 你无法从书中获得一切。
编辑:
我决定提供一个与你的Python版本更加内联的不同解决方案(不是很漂亮的IMO)
(apply +
(for [i (range 1000) :when (or (zero? (mod i 3))
(zero? (mod i 5)))]
i))
只是另一个版本:
(defn sum-of [n]
(reduce + (range n 1000 n)))
(+ (sum-of 3) (sum-of 5) (- (sum-of 15)))
我喜欢尝试为项目欧拉解决一个通用的解决方案,所以这里是我的通用解决方案:
(defn sum-multiples [nums lim]
(reduce
+
(filter
(fn [x]
(some identity
(map #(zero? (mod x %)) nums)))
(range lim))))
然后只需打电话:
(sum-multiples [3 5] 1000)
链接地址: http://www.djcxy.com/p/33627.html