【问题标题】:IllegalStateException Attempting to call unbound fnIllegalStateException 试图调用未绑定的 fn
【发布时间】:2018-08-05 17:59:30
【问题描述】:

我知道以前有人问过这个问题,但我找不到我遇到的问题的答案。下面的代码在-“(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:查找最小交换的代码尚未完成。

【问题讨论】:

  • 我编辑了 swap-arr 方法。我正在尝试交换向量中的元素,并且此方法适用于 REPL
  • swap-arr 有效,但minimumSwaps 真的不是 Clojure。 for 不应像 Java 或 Python 中的循环一样使用,并且将 var 与 ref 绑定作为循环的一部分将不起作用。有关基本循环,请查看loop in the docs
  • 我认为 `(println (arr 0)) 在任何情况下都会打印 nil,无论 arr 中是否有 0。
  • 谢谢!习惯功能性思维方式需要一些时间。

标签: clojure lisp


【解决方案1】:

我意识到,我在调试时遇到了错误,那是因为“范围”是一个惰性序列,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)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多