【发布时间】:2016-03-20 15:01:35
【问题描述】:
我有两个这样的向量(或集合,没关系): [1 2 3...
我们说
(def v (range 1 4))
我想计算这个向量的“交叉”和。 我的意思是对于 v 中的每个 x,计算它与 v 的每个值的总和。
假设向量是 [1 2 3],我想要一个这样的矩阵:
(1)(2)(3)
(1) 2 3 4
(2) 3 4 5
(3) 4 5 6
我不知道我是否清楚,但我没有看到任何 Clojure 函数可以做到这一点。 我会考虑递归或排列,但它似乎不是很地道。
有什么想法吗?
谢谢!
编辑
计算“交叉”总和的代码示例(仅当数字不同时),在 mod n 处减少总和,然后计算关于它的统计数据
(defn crossed-sum [n]
(let [v (range 1 (+ n 1))]
(mapcat
(fn [x]
(for [k v
:let [y (cond (= k x)
-1
:else
(+ k x))]]
y))
v)))
(defn mod-reduc [data n]
(map
(fn [x]
(rem x n))
data))
(defn compute-probability [n]
(let [c-sum (-> (crossed-sum n)
(mod-reduc n)
(frequencies)
(dissoc -1))
s (reduce + (vals c-sum))]
(apply conj (map
(fn [[k v]]
{k (float (/ v s))})
c-sum))))
我使用了for,但它是惯用的吗?
【问题讨论】:
标签: clojure