3

私はClojure in Actionブックを調べており、合計が素数であるm未満の数値のすべてのペアを返す関数に対して、以下のようなコードが与えられています( prime?が与えられたと仮定します):

(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]
...
4

2 に答える 2

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))))
于 2013-02-08T23:46:46.363 に答える
1

それを行うために使用できますtakepairs-for-primesシーケンスを返すと、take必要なアイテムの数のみが計算されます)

(defn all-ntuples-below [n m]
  (take n (pairs-for-primes m)))
于 2013-02-09T07:27:58.397 に答える