我目前正在尝试编写一个程序,该程序将假定已经升序的两个数字列表进行递归合并。
到目前为止,我有:
(defun MERGESORT (NLIST1 NLIST2)
(cond ((null NLIST1)NLIST2)
((null NLIST2)NLIST1)
((<= (car NLIST1) (car NLIST2)) (cons(car NLIST1)(car Nlist2))
(MERGESORT(cdr NLIST1)(cdr NLIST2)))
(t(cons(car NLIST2)(car NLIST1))
(MERGESORT (cdr NLIST1)(cdr NLIST2)))))
当我使用
将功能写入控制台时(write (MERGESORT '(1 1 2 4 7) '(1 2 2 3 4 6 9)))
我似乎要输出的是(6 9)
我想得到(1 1 1 2 2 2 3 4 4 6 7 9)。
我可能会过分考虑条件,我知道这只是比较前两个元素,先输出两个元素中较小的一个然后再递归的问题,但是现在我遇到了障碍。你们会如何做这个程序?
答案 0 :(得分:8)
首先,这是merge
,而不是mergesort
-参数已经排序。
您的代码确实不可读。经过缩进,它是
(defun MERGE (NLIST1 NLIST2)
(cond
((null NLIST1) NLIST2)
((null NLIST2) NLIST1)
((<= (car NLIST1) (car NLIST2))
(cons (car NLIST1) (car Nlist2)) ; ?? no effect
(MERGE (cdr NLIST1) (cdr NLIST2)))
(t
(cons (car NLIST2) (car NLIST1)) ; ?? no effect
(MERGE (cdr NLIST1) (cdr NLIST2)))))
如您所见,括号是错误的。始终使用缩进,以更好地查看代码结构。
应该是
(defun MERGE (NLIST1 NLIST2)
(cond
((null NLIST1) NLIST2)
((null NLIST2) NLIST1)
((<= (car NLIST1) (car NLIST2))
(cons (car NLIST1)
(MERGE .... ....)))
(t
(cons (car NLIST2)
(MERGE .... ....)))))