递归地将序列与自身组合,没有重复

时间:2013-02-27 21:47:00

标签: clojure

这很难解释,但很容易显示。不知道为什么我自己也没想出来,所以我必须错过一些显而易见的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库来并行化背景中较重的数学。

提前致谢!

3 个答案:

答案 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])