我知道这个问题以前曾被问过,但我找不到我所遇到问题的答案。下面的代码在-“(println(arr 0))”处出错。但是该行应打印出4吗?我是Clojure的新手,也不了解我在哪里出问题了。
我在REPL中尝试了(defn arr [4 3 2 1])(arr 0),这似乎可行。
(defn swap-arr [my-arr x y]
(assoc my-arr x (my-arr y) y (my-arr x)))
(defn minimumSwaps [arr]
(for [i (range (count arr))]
(do (println (arr 0))
(while (not= i (arr i))
(def arr (swap-arr arr (arr i) (- 1 i)))))))
(minimumSwaps [4 3 2 1])
PS:查找最小交换的代码尚未完成。
答案 0 :(得分:0)
我意识到,是在调试时出现错误,这是因为“ range”是一个惰性序列,而REPL不喜欢它。
我还是将代码更改为此-
(defn minimumSwaps [org-vec]
(loop [mut-vec org-vec, i 0, swap-count 0]
(if (< i (count org-vec))
(let [sub-arr (subvec mut-vec i)]
(recur (swap-arr mut-vec (mut-vec i) (apply min sub-arr))
(+ i 1)
(if (= (apply min sub-arr) (mut-vec i)) swap-count (+ swap-count 1))))
swap-count)))