我正在浏览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]
...
答案 0 :(得分:2)
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))))
答案 1 :(得分:1)
您可以使用take
来执行该操作(因为pairs-for-primes
会返回一个序列take
,只会导致它计算所需的项目数量)
(defn all-ntuples-below [n m]
(take n (pairs-for-primes m)))