Clojure甚至列出偶数

时间:2017-12-04 20:37:24

标签: list clojure partition

目前我正在尝试将clojure中的列表划分为偶数值的偶数。 解释一下。

我有

(def a '(1 2 3 4 5 6 7 8 9 10))

我想要做的是给它一个分区功能,并创建偶数列表。 所以,如果我将列表拆分为2,我希望它看起来像

((1 2 3 4 5 6) (7 8 9 10)) or 
((1 2 3 4)(5 6 7 8 9 10)) producing 2 lists with even counts.

或者如果我想将4分成偶数列表,它看起来像

((1 2)(3 4)(5 6)(7 8 9 10)) 

我将永远被(ex. 2,4,8,16,32)分裂。但是我希望每个返回列表都没有余数。

我迷失了,创造了许多无法工作的分区功能。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

我将如何做到这一点:

(def a '(1 2 3 4 5 6 7 8 9 10))

(defn trunc-to-even
  "Truncates a value the largest even int less than or equal to value"
  [val]
  (* 2 (Math/floor (/ val 2))))

(defn even-lists [some-list]
  (let [half-even (trunc-to-even (/ (count some-list) 2))]
    (split-at half-even some-list )))

(println (even-lists a))

;=>  [(1 2 3 4) (5 6 7 8 9 10)]

答案 1 :(得分:0)

将上面的标记标记为正确答案。我能够使用这种方法进一步将其分解为偶数列表。

(defn trunc-to-even
"Truncates a value the largest int less than or equal to value"
  [val]
  (* 2 (Math/floor (/ val 2))))

(defn split-2 [some-list]
  (let [half-even (trunc-to-even (/ (count some-list) 2))]
    (split-at half-even some-list )))

(defn split-4 [x]
  (apply concat (pmap split-2(concat (split-2 x)))))

这样做我可以继续在8-16-32分开。