【发布时间】:2019-09-25 19:55:22
【问题描述】:
我正在尝试在 CLisp 中实现快速排序,到目前为止,我能够围绕一个枢轴对列表进行分区。但是,当我尝试合并子列表并递归排序时,我得到堆栈溢出或let 错误,我不确定出了什么问题。这是我的代码:
(defun pivot (n xs)
(list (getLesser n xs) (getGreater n xs))
)
(defun getLesser (m l)
(cond
((null l) nil)
((<= m (car l)) (getLesser m (cdr l)))
(t (cons (car l) (getLesser m (cdr l)))))
)
(defun getGreater (m l)
(cond
((null l) nil)
((> m (car l)) (getGreater m (cdr l)))
(t (cons (car l) (getGreater m (cdr l)))))
)
(defun quicksort (xs)
(cond
((null xs) nil)
(t
(let (partition (pivot (car xs) xs))
(cond
((null (car partition)) (cons (quicksort (cdr partition)) nil))
((null (cdr partition)) (cons (quicksort (car partition)) nil))
(t (append (quicksort (car partition)) (quicksort (cdr partition)))))))))
我的想法是有一个局部变量partition,它是2 个列表的列表,其中car partition 是小于枢轴的数字列表,cdr partition 是大于枢轴的数字列表。然后,在最后的cond 构造中,如果没有小于枢轴的数字,我将对第二个列表进行递归排序;如果没有大于枢轴的数字,我将对第一个列表进行排序;否则我会递归地对两者进行排序并按顺序附加它们。谁能帮帮我?
【问题讨论】:
标签: recursion syntax common-lisp let clisp