Clojure - 返回向量向量的函数

时间:2017-05-03 09:10:10

标签: clojure

我想写一个函数,当你传入一个向量作为参数时,它会返回向量的迭代,即

  • 如果您传入[1],则返回[1]
  • 如果您传入[1 2],则返回[[1 2] [2 1]]
  • 如果你传入[1 2 3],则返回[[1 2 3] [2 3 1] [3 1 2]] 等

非常感谢任何帮助

3 个答案:

答案 0 :(得分:4)

https://github.com/clojure/math.combinatorics/中的permutations函数可以用于

Readme.md的示例:

(ns example.core
  (:require [clojure.math.combinatorics :as combo]))

; PERMUTATIONS
; all the unique arrangements of items
=> (combo/permutations [1 2 3])
([1 2 3] [1 3 2] [2 1 3] [2 3 1] [3 1 2] [3 2 1])

; Note that permutations intelligently handles duplicate items
=> (combo/permutations [1 1 2])
([1 1 2] [1 2 1] [2 1 1]) 

答案 1 :(得分:2)

它可能看起来像那样:

user> (defn its [items]
        (let [c (count items)]
          (if (<= c 1)
            items
            (->> items
                 cycle
                 (partition c 1)
                 (take c)
                 (mapv vec)))))
#'user/its

user> (its [])
;;=> []

user> (its [1 2])
;;=> [[1 2] [2 1]]

user> (its [1 2 3])
;;=> [[1 2 3] [2 3 1] [3 1 2]]

答案 2 :(得分:0)

这里的基本思路是将输入分成两部分,然后以相反的顺序连接两部分(第二部分之后的第一部分)。

所以你需要一个函数来计算向量的旋转:

(defn rotations [v]

你想使用矢量(用于快速随机访问),你还需要矢量的大小。

(let [v (vec v)
      n (count v)]

您需要遍历输入中应切割的每个位置:

  (for [i (range n)]

然后在第i个位置剪切向量,并按相反的顺序合并它们:

    (into (subvec v i n) (subvec v 0 i))

哦,别忘了关闭括号!

)))