我被困在试图得到一个简单的循环在Clojure工作,我不知道如何继续摆脱异常。我试着写出一个arrange
函数到一个向量中的exchange
项。代码如下:
(defn exchange [v i]
(let [[src dst] i]
(assoc v dst (v src) src (v dst))))
(defn arrange []
(loop [idxs [0 0]
deck [a b c d e]
pts [[0 1] [2 3] [4 1]]]
(println idxs deck pts)
(empty? pts)
deck
(recur (first pts) (exchange deck idxs) (rest pts))))
;(arrange)
;[b e d c a]
如果我删除println,我在REPL中看不到任何东西。我来自COBOL,所以你知道我正在努力学习:)任何让它更地道的建议都会很受欢迎。
- 6/11这是更正后的代码。arrange
在回路中应该只有两个参数
(defn arrange []
(loop [deck [a b c d e]
lst [[0 1] [2 3] [4 1]]]
(if (empty? lst)
deck
(recur (exchange deck (first lst)) (rest lst)))))
或者更好,使用(reduce exchange deck lst)
代替@Magos!
您缺少一个if
,您需要在idxs
上结束循环,而不是在pts
上(否则您将错过最后的索引对):
(if (empty? idxs)
deck
(recur (first pts) (exchange deck idxs) (rest pts)))