【发布时间】:2014-07-31 09:10:05
【问题描述】:
我从 Clojure 的喜悦中复制了惰性快速排序实现 并在循环后添加了两个 println 语句,以更好地理解输入的工作原理(参见底部的实现)。
运行 (qsort [2 1 4 3]) 时,我得到以下输出:
Work: = ([2 1 4 3]) =
Part: = [2 1 4 3] & nil =
=pivot: 2 =
Work: = ([2 1 4 3]) =
Part: = (1) & (2 (4 3)) =
[...]
正如预期的那样。我不明白的是Work的结构。 Work 怎么可能只是一个包含向量的列表,而part & parts 怎么可能是(1) & (2 (4 3))。 Work不应该有以下结构[(1) (2 (4 3))]吗?
完整性的快速排序实现:
(defn sort-parts
"Lazy, tail-recursive, incremental quicksort. Works against and
creates partitions based on the pivot, defined as 'work'."
[work]
(lazy-seq
(loop [[part & parts] work]
(println "Work: =" work "=")
(println "Part: =" part "&" parts "=")
(if-let [[pivot & xs] (seq part)]
(do (println "=pivot: " pivot "=")
(let [smaller? #(< % pivot)]
(recur (list*
(filter smaller? xs)
pivot
(remove smaller? xs)
parts))))
(when-let [[x & parts] parts]
(println "output")
(cons x (sort-parts parts)))))))
(defn qsort [xs]
(sort-parts (list xs)))
【问题讨论】: