我想改变以下顺序:
(def boollist [true false false false true false true])
Run Code Online (Sandbox Code Playgroud)
进入以下:
[[true] [false false false true] [false true]]
Run Code Online (Sandbox Code Playgroud)
我的代码导致Stackoverflow:
(defn sep [boollst]
(loop [lst boollst
separated [[]]
[left right] (take 2 lst)]
(if (nil? left) separated)
(recur (next lst)
(if (false? left)
(conj (last separated) left)
(conj separated [left]))
(take 2 (next lst)))))
Run Code Online (Sandbox Code Playgroud)
是否有一种优雅的方式来改变这种情况?
可能有更优雅的方式,但这就是我提出的方法:
(defn f
([xs] (f xs [] []))
([[x & xs :as all] acc a]
(if (seq all)
(if x
(recur xs [] (conj a (conj acc x)))
(recur xs (conj acc x) a))
a)))
Run Code Online (Sandbox Code Playgroud)
它只是遍历序列,跟踪当前的谬误向量,以及迄今为止所有内容的大累加器.