clojure - 将 Clojure 解决方案推广到 Euler #1

标签 clojure functional-programming

Q = 求 1000 以下的所有 3 或 5 的倍数之和。

最简单的答案

(reduce + (filter #(or (== (mod % 3) 0) (== (mod % 5) 0)) (range 1000))) 

尝试获取如下通用答案

(reduce + (list-nums-divisible-by-all-divisors N div1 div2 ...))
(defn list-nums-divisible-by-all-divisors
    [num & divisors]
    (let [myfn (create-fn divisors)]
        (filter myfn (range num)))) 

这是 2 个除数的 create-fn

(defn create-fn
  [div1 div2]
  #(or (== (mod % div1) 0) (== (mod % div2) 0)))

如何为可变数量的除数编写 create-fn ?

这是解决这个问题的正确方法吗?我有一种感觉,我可能应该使用 -> 或 ->> 运算符,而不是这种方式。

此外,我认为这成为一个普遍问题。可以使用可变数量的参数创建并返回一个函数,然后将其用作匿名函数(具有另一级别的参数)吗?

提前致谢:-)

最佳答案

我建议更精细一些,构建几个谓词,然后使用 every-pred 将它们组合起来。 。该函数非常方便地从多个谓词中构建一个谓词。

首先,从柯里化(Currying)整除函数开始:

(defn divisible-by? [n]
  (fn [x]
    (zero? (rem x n))))

柯里化(Currying)只是意味着为了让函数“接受两个参数”,我们首先接受一个参数,然后构建一个接受第二个参数的函数。这些用法就像

((divisible-by? 3) 6) ;;-> true

在本例中,我们想要这种行为,因为我们想要映射一个创建一元谓词的函数,如下所示:

(defn create-fn [divisors]
  (apply every-pred (map divisible-by? divisors)))

关于clojure - 将 Clojure 解决方案推广到 Euler #1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28870866/

相关文章:

clojure - 修改 clojure 代码时有没有保留注释的好方法?

haskell - 是否有基于终端及其祖先映射递归数据类型的名称?

haskell - `squares xs = [x*x|x<-xs]` 在 Haskell 中意味着什么?

clojure - 避免覆盖变量名

clojure - 无法解析 Cascalog 中谓词中的符号

java - 从java调用clojure

Haskell - 由于我不明白的原因,非穷举模式

clojure - 如何在 Clojure 中将序列转换为 byte[]?

.net - 寻找类似于 map 的 F# 库函数,它将传递给 f 当前的计算状态

java - 如何映射 "Try with resources"异常类型?