Loops Clojure doseq嵌套循环以生成新集合
在Clojure中,我希望能够将一个集合中的所有数字相乘,然后将它们全部添加到一个新集合中以返回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
=>(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)))