Clojure在输入序列中交换元素
如何使用clojure交换输入序列中的相邻元素。 [10 15 20 25] ---> [15 10 25 20] [:q:e:g:t:p]-->[:e:q:t:g:p] 我就是这样做的,但我敢肯定还有更好的方法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
(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)))