2013-02-27 68 views
0

这很难解释,但很容易显示。不知道为什么我自己不明白,所以我必须在clojure中漏掉一些明显的东西。我需要将一个矢量与它自己结合到一个矢量中,并且我需要将第一个元素与所有剩余元素,第二个元素以及所有剩余元素(第三个和后一个)结合起来。递归结合序列,无重复

作为短例如: [1 2 3 4 5]

我需要一个函数来得到: [[1 2] [1 3] [1 4] [1 5] [2 3] [2 4] [2 5] [3 4] [3 5]]

如果这看起来像获得大矩阵的一半对,那么你是对的。我只想解决一半减去中间对角线的矩阵。这是我需要顺序处理的唯一部分(所以我只解决一半),其余部分我想使用reducer库来平行化背景中较重的数学。

在此先感谢!

+0

你从结果中故意错过'[4 5]'吗? – Andrew 2013-02-27 22:08:23

+0

我一定有,对不起!我认为在这个例子中使用数字是一个错误,因为我正在使用的序列是数字的向量,我认为事情很混乱。我的意思是它比它最终成为一个更抽象的例子。 – 2013-02-28 17:16:43

回答

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)) 
+0

谢谢,我曾尝试过这个库,但得到一个错误。我认为这是因为我的序列是非数字的,但显然它可以与非数字序列一起工作,而我只是缺少2作为第二个参数。 – 2013-02-28 14:56:39

+0

为什么我们需要一个组合库来完成这样一个简单的任务? – Blacksad 2013-02-28 15:26:07

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