我应该用吗?
(apply + (filter prime? (range 1 20)))
Run Code Online (Sandbox Code Playgroud)
要么
(reduce + (filter prime? (range 1 20)))
Run Code Online (Sandbox Code Playgroud)
编辑:这是优化工具包中的素数来源.
(defn prime? [n]
(cond
(or (= n 2) (= n 3)) true
(or (divisible? n 2) (< n 2)) false
:else
(let [sqrt-n (Math/sqrt n)]
(loop [i 3]
(cond
(divisible? n i) false
(< sqrt-n i) true
:else (recur (+ i 2)))))))
Run Code Online (Sandbox Code Playgroud) Fold(又名reduce)被认为是一个非常重要的高阶函数.Map可以表示fold(见这里).但这对我来说听起来比实际更具有学术性.典型的用途可能是获得总和,产品或数字的最大值,但这些函数通常接受任意数量的参数.那么为什么写的(fold + 0 '(2 3 5))时候(+ 2 3 5)工作正常.我的问题是,在什么情况下使用最简单或最自然fold?
我有:
(def data [[1 3 4 7 9] [7 6 3 2 7] [1 9 8 6 2]])
Run Code Online (Sandbox Code Playgroud)
我想平均这些(元素明智得到):
[3 6 5 5 6]
Run Code Online (Sandbox Code Playgroud)
就像你在MATLAB中一样:
mean([1 3 4 7 9; 7 6 3 2 7; 1 9 8 6 2])
Run Code Online (Sandbox Code Playgroud)
有了Incanter,我可以这样做:
(map #(/ % (count m)) (apply plus data))
Run Code Online (Sandbox Code Playgroud)
如果数据相当大(我有很多),有更好的方法吗?事先
算出来有帮助(count m)吗?
它是否有助于defn在#(/ % (count m))事先?
必须有一个简单的方法来做到这一点,我显然想念它:|
如何在clojure中的列表\序列中添加项目(区别不明确)?
我尝试过以下方法:
Clojure> (add [1 2 3])
java.lang.RuntimeException: Unable to resolve symbol: add in this context
Clojure> (+ [1 2 3])
java.lang.ClassCastException: Cannot cast clojure.lang.PersistentVector to java.lang.Number
Clojure> (apply merge-with + [1 2 3])
java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long
Clojure> (add-items [1 2 3])
java.lang.RuntimeException: Unable to resolve symbol: add-items in this context
Run Code Online (Sandbox Code Playgroud) 在Clojure中,我有一张这样的地图:
(def data {:a 1 :b 2 :c 3})
Run Code Online (Sandbox Code Playgroud)
我想总结所有元素并得到6结果.我知道我应该使用reduce,但我不知道如何正确地做到这一点.