Лисп рекурсивный слияния с возрастающим порядком? - PullRequest
0 голосов
/ 06 октября 2018

Я сейчас пытаюсь написать программу, которая берет два списка чисел, которые, как предполагается, уже находятся в порядке возрастания, и рекурсивно объединяет их.

Пока у меня есть:

(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 67 9).

Возможно, я немного переосмыслил условия, и я знаю, что это просто вопрос сравнения первых двух элементов, сначала вывод меньшего из двух элементов, а затем повторение, но сейчас я нахожусь вконтрольно-пропускной пункт.Как бы вы, ребята, сделали эту программу?

1 Ответ

0 голосов
/ 06 октября 2018

Во-первых, это 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 .... ....)))))
...