这是惯用的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

上一篇: Is this idiomatic Clojure?

下一篇: Abusing the algebra of algebraic data types