Loops Clojure doseq嵌套循环以生成新集合

Loops Clojure doseq嵌套循环以生成新集合,loops,clojure,Loops,Clojure,在Clojure中,我希望能够将一个集合中的所有数字相乘,然后将它们全部添加到一个新集合中以返回 =>(multiply-all #{ 1 2 3}) #{1 4 6 3 2 9} 以下是我的实现: (defn multiply-all [num-set] (loop [new-set num-set cur-set num-set] (if (= 0 (count cur-set)) new-set (recur (into new

在Clojure中,我希望能够将一个集合中的所有数字相乘,然后将它们全部添加到一个新集合中以返回

=>(multiply-all #{ 1 2 3})

#{1 4 6 3 2 9}
以下是我的实现:

(defn multiply-all [num-set]
  (loop [new-set num-set
         cur-set num-set]
       (if (= 0 (count cur-set))  new-set
       (recur (into new-set (map #(* (first cur-set) %) num-set)) (rest cur-set)))))
有没有一种方法可以在不使用瞬态的情况下使用doseq来实现这一点。大概是这样的:

(let [s #{ 1 2 3}]
 (doseq [outer s]
   (doseq [inner s]
     (let [multiplied (* outer inner)]
      (println (conj s multiplied))
      ))))
我对任何关于清洁方法的建议都感兴趣

---编辑---- 下面是使用reduce的另一种方法:

(defn multiply-all2 [num-set]
  (let [step (fn [[ result ] mult]
           [(into result (map #(* mult %) num-set))])]
    (first (reduce step [num-set] num-set))))
是副作用。您可能想改用:


很酷。对于新手来说,使用“for”的另一个解决方案可能更容易,但是知道这个选项很好。
user=> (set (for [a #{1 2 3} 
                  b #{1 2 3}] 
              (* a b)))
#{1 4 6 3 2 9}
(defn multiply-all [s]
  (set (mapcat #(map * s (repeat %)) s)))