Clojure在输入序列中交换元素

Clojure在输入序列中交换元素,clojure,sequence,swap,Clojure,Sequence,Swap,如何使用clojure交换输入序列中的相邻元素。 [10 15 20 25] ---> [15 10 25 20] [:q:e:g:t:p]-->[:e:q:t:g:p] 我就是这样做的,但我敢肯定还有更好的方法 (defn switch [s] (loop [[a b & rest] s result []] (if (empty? rest) (cond ;;empty sequence (empty? s) result

如何使用clojure交换输入序列中的相邻元素。 [10 15 20 25] ---> [15 10 25 20] [:q:e:g:t:p]-->[:e:q:t:g:p]

我就是这样做的,但我敢肯定还有更好的方法

(defn switch [s]
(loop [[a b & rest] s
       result []]
  (if (empty? rest)
    (cond
        ;;empty sequence
        (empty? s) result
        ;;odd sequence
        (nil? b) (conj result a)
        ;;even sequence
        :else (conj result b a)
    )
    (recur rest (conj result b a))))
    )

我投票结束这个问题,因为:这似乎是一个简单的家庭作业问题。展示你迄今为止所做的工作。@Alan Thompson这不是官方的堆栈溢出。我们关心被问得很好的问题,这些问题与它们是否是家庭作业无关。在我看来,这个很好,因为它清楚地定义了所需的行为并显示了一种尝试。这甚至是一种工作上的尝试,询问如何做得更好。在first postedI投票结束这个问题时,第一行是唯一出现的东西,因为:这似乎是一个简单的家庭作业问题。展示你迄今为止所做的工作。@Alan Thompson这不是官方的堆栈溢出。我们关心被问得很好的问题,这些问题与它们是否是家庭作业无关。在我看来,这个很好,因为它清楚地定义了所需的行为并显示了一种尝试。这甚至是一次有效的尝试,寻求更好的方法。第一行是第一次发布
(map reverse)
+
Flatte
=
(mapcat reverse)
时出现的唯一内容。你的方式更简洁,不仅更简洁,而且更正确<代码>展平几乎永远都不是正确的答案。想象一下,如果A被定义为
[[1 2][3 4]]
。我们希望结果是
[[3 4][1 2]]
,但使用
展平
版本,我们将得到
[3 4 1 2]
(映射反向)
+
展平
=
(mapcat反向)
。你的方式更简洁,不仅更简洁,而且更正确<代码>展平几乎永远都不是正确的答案。想象一下,如果A被定义为
[[1 2][3 4]]
。我们希望结果是
[[3 4][1 2]]
,但使用
扁平化
版本,我们将得到
[3 4 1 2]
(let [A [:q :e :g :t :p]]
    (->> A
         (partition-all 2)
         (mapcat reverse)))