2013-02-08 28 views
3

我通過類似於下面給出了一個返回下面其總和所有對數函數的Clojure in Action book和代碼將會是一個最好的(?假設黃金給出):找米以下,其總和的所有整數的n元組是素

(defn pairs-for-primes [m] 
    (let [z (range 0 m)] 
    (for [a z b z :when (prime? (+ a b))] 
     (list a b)))) 

一個怎麼會籠統地說要返回所有數的n元組米以下,其總和就是一個最好的?

(defn all-ntuples-below [n m] 
... 

回答

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

您可以使用take做到這一點(如pairs-for-primes返回序列take只會引起它來計算所需物品的數量)

(defn all-ntuples-below [n m] 
    (take n (pairs-for-primes m))) 
相關問題