Lisp递归mergesort与升序?

时间:2018-10-06 15:58:44

标签: list syntax lisp common-lisp mergesort

我目前正在尝试编写一个程序,该程序将假定已经升序的两个数字列表进行递归合并。

到目前为止,我有:

(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)。

我可能会过分考虑条件,我知道这只是比较前两个元素,先输出两个元素中较小的一个然后再递归的问题,但是现在我遇到了障碍。你们会如何做这个程序?

1 个答案:

答案 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 .... ....)))))