Hallo Schreiben so Frage, die ich habe, dass ich einige Schwierigkeiten habe und MERGE LISTEN eine rekursive Lisp Funktion msort zu definieren, so dass, wenn L ist eine Liste von reellen Zahlen, dann (MSORT L) ist eine Liste, die aus den Elementen von L in aufsteigender Reihenfolge besteht. In der Definition von MSORT können Sie SPLIT-LIST, , MSORT selbst, MERGE-LISTS, CAR, CDR, CADR und ENDP aufrufen, aber Sie sollten keine andere andere Funktion aufrufen. Achten Sie darauf, LET oder LET * zu verwenden, damit MSORT SPLIT-LIST nur einmal aufruft.Schwierigkeit LISP rekursive Funktion für Merge Sort
Bis jetzt konnte ich die Funktionen SPLIT-LIST und MERGE-LISTS korrekt schreiben, aber für M-SORT habe ich Probleme beim Schreiben der Funktion. Siehe unten alle drei Definitionen bis jetzt. Jede Hilfe zum korrekten Schreiben der MSORT-Funktion durch Befolgen der Richtlinien in der Frage wäre willkommen.
(defun SPLIT-LIST (L)
(if (endp L)
'(nil nil)
(let ((X (split-list (cdr L))))
(list (cons (car L)(cadr X)) (car X)))))
(defun MERGE-LISTS (L1 L2)
(cond
((and(endp L1)(endp L2)) nil)
((endp L1) (cons (CAR L2) (MERGE-LISTS nil (CDR L2))))
((endp L2) (cons (CAR L1) (MERGE-LISTS (CDR L1) NIL)))
((< (CAR L1) (CAR L2)) (cons (CAR L1) (MERGE-LISTS (CDR L1) L2 )))
((>= (CAR L1) (CAR L2)) (cons (CAR L2) (MERGE-LISTS L1 (CDR L2)) ))))
(defun MSORT (L)
(cond ((endp L) nil)
((equal (Length L) 1) L)
(T
(let* (
(S (SPLIT-LIST L))
(L1 (CAR S))
(L2 (CADR S))
(X (MSORT (cdr L1)))
(Y (MSORT (cdr L2)))
)
(MERGE-LISTS
(if (and (numberp (car L1)) (numberp (car X))(<= (car L1) (car X)))
(list (car L1) (car X))
(list (car X) (car L1))
)
(Cons (car L2) Y))
)))
)
Warum rufen Sie "MSORT" nur auf der cdr von 'L1' und' L2'? Sortieren Sie alle vollständig und fügen Sie dann die Ergebnisse zusammen. – Barmar
Ich nehme an, dass der Punkt hier ist, diese selbst zu implementieren, aber beachten Sie, dass Common Lisp bietet eine [** merge ** -Funktion] (http://www.lispworks.com/documentation/HyperSpec/Body/f_merge.htm) das funktioniert mit Listen (und Vektoren!). (Natürlich bietet es auch eine ** Sortierung ** -Funktion, aber das ist nicht unbedingt eine Merge-Sortierung.) –