在Clojure中,我希望能够将一组中的所有数字相乘并将它们全部添加到一个新的集合中以返回.
=>(multiply-all #{ 1 2 3})
#{1 4 6 3 2 9}
Run Code Online (Sandbox Code Playgroud)
这是我的实现:
(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)))))
Run Code Online (Sandbox Code Playgroud)
有没有办法使用doseq而不使用瞬态来做到这一点.像这样的东西:
(let [s #{ 1 2 3}]
(doseq [outer s]
(doseq [inner s]
(let [multiplied (* outer inner)]
(println (conj s multiplied))
))))
Run Code Online (Sandbox Code Playgroud)
我对任何有关更清洁方式的建议感兴趣.
---编辑----这是使用reduce的另一种方式:
(defn multiply-all2 [num-set]
(let [step (fn [[ result ] mult]
[(into result (map #(* mult %) num-set))])]
(first (reduce step [num-set] num-set))))
Run Code Online (Sandbox Code Playgroud)
user=> (set (for [a #{1 2 3}
b #{1 2 3}]
(* a b)))
#{1 4 6 3 2 9}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
832 次 |
| 最近记录: |