这很难解释,但很容易显示。不知道为什么我自己也没想出来,所以我必须错过一些显而易见的clojure。
我需要将一个向量与自身组合成一个向量,我需要将第一个元素与所有剩余元素组合,然后将第二个元素与所有剩余元素(第3个和之后)组合。
作为一个简短的例子: [1 2 3 4 5]
我需要一个函数来获取: [[1 2] [1 3] [1 4] [1 5] [2 3] [2 4] [2 5] [3 4] [3 5]]
如果这看起来像是一个大矩阵的一半,那么你是对的。我只想解决一半矩阵减去中间对角线。这是我需要顺序的唯一部分(所以我只解决了一半),其余的我想使用reducers库来并行化背景中较重的数学。
提前致谢!
答案 0 :(得分:3)
你想要的是内置于clojure / math.combinatorics: https://github.com/clojure/math.combinatorics
您正在寻找的基本示例是自述文件,但为了完整答案,我将在此重复:
(ns example.core
(:require [clojure.math.combinatorics :as combo]))
(combo/combinations [1 2 3] 2)
;;=> ((1 2) (1 3) (2 3))
答案 1 :(得分:3)
我只使用for
:
(for [ i (range 1 6) j (range 6) :when (< i j)] [i j])
; => ([1 2] [1 3] [1 4] [1 5] [2 3] [2 4] [2 5] [3 4] [3 5] [4 5])
答案 2 :(得分:0)
(def v [1 2 3 4 5])
(for [i (range (count v))
:let [vv (drop i v)]
r (rest vv)]
[(first vv) r])
=> ([1 2] [1 3] [1 4] [1 5] [2 3] [2 4] [2 5] [3 4] [3 5] [4 5])