我正在通过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))))

10-07 20:23