这是惯用的Clojure吗?

gum*_*muz 7 clojure

我已经开始使用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代码的惯用版本会是什么样的?

Kyl*_*yle 8

我就这样做了:

(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)


mis*_*off 8

只是另一个版本:

(defn sum-of [n]
  (reduce + (range n 1000 n)))

(+ (sum-of 3) (sum-of 5) (- (sum-of 15)))
Run Code Online (Sandbox Code Playgroud)

  • 可爱的。还有`(reduce + (distinct (concat (range 3 1000 3) (range 5 1000 5))))` (2认同)