找到m以下所有整数的n元组,​​其总和是素数

时间:2013-02-08 22:02:49

标签: clojure

我正在浏览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]
...

2 个答案:

答案 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)))