gpt4 book ai didi

clojure - Clojure 中简单的快速排序

转载 作者:行者123 更新时间:2023-12-02 16:51:00 25 4
gpt4 key购买 nike

我正在学习 clojure,想要创建我的天真的快速排序。此实现将数组(向量)切成两半并递归处理它们。问题是,当数组(向量)大小为 1 时,这段代码恰好在递归结束时抛出 NullPointerException。这是为什么?

(ns qsort)

(defn qsort [arr]
(println "arr" arr)
(def cnt (count arr))
(def pivotidx (if (> cnt 1)
(int (/ cnt 2))
-1
))

(print "pivotidx:" pivotidx " ")
(if (> pivotidx -1)
((def pivotval (nth arr pivotidx))
(println "pivotval:" pivotval " ")
(def right (filter #(> % pivotval ) arr))
(def left (filter #(< % pivotval) arr))
(println "left" left "right" right)
(concat (qsort left) [pivot] (qsort right))
)
arr
)
)


(defn sortme [] (qsort [3 5 8 9 1 7 12 13 2 14 0]))

最佳答案

其他答案已经很好地描述了“正确”的做事方式,这恰好也解决了您的问题。但是,您的 NPE 是由

((def pivotval (nth arr pivotidx))
...more stuff...)

不能简单地使用()对元素进行分组:lisp中的(foo)表示调用函数foo;同样,((bar) (foo)) 表示:

  1. 调用bar,将结果保存为x
  2. 调用foo。将结果保存为y
  3. 使用参数y调用函数x

由于 def 不返回函数,因此使用六个或七个参数调用其结果会导致问题。

相反,如果您想对事物进行分组,则应该使用 do 特殊形式。 (do (foo) (bar)) 表示“调用 foo,然后返回调用 bar 的结果”。

关于clojure - Clojure 中简单的快速排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6815929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com