我正在通过Clojure in Action book,并且为下面的函数提供了类似于以下代码的函数,该函数返回m以下所有和为质数的数字对(假定质数为给定):
(defn pairs-for-primes [m]
(let [z (range 0 m)]
(for [a z b z :when (prime? (+ a b))]
(list a b))))
如何将其归纳为返回m以下所有和为质数的所有n个元组?
(defn all-ntuples-below [n m]
...
最佳答案
for
可以用于笛卡尔积的一种“特殊情况”,您可以在编译时预先知道它们。由于您实际上并不知道要乘积的集合,因此需要使用真正的笛卡尔乘积函数。例如,使用clojure.math.combinatorics,您可以编写
(defn pairs-for-primes [m n]
(let [z (range 0 m)
tuples (apply cartesian-product (repeat n z))]
(filter #(prime? (apply + %)) tuples)))
但是,也许您的问题是关于如何实现笛卡尔积的?尽管下面的版本性能不高,但并不难:
(defn cartesian-product [sets]
(cond (empty? sets) (list (list))
(not (next sets)) (map list (first sets))
:else (for [x (first sets)
tuple (cartesian-product (rest sets))]
(cons x tuple))))