2016-04-08 10 views
0

2つのソートされた関連リストをCommon Lispでマージしソートしたい。 コードを作った。しかし結果は私の考えと同じではありません。Common Lispで2つのソートリストをマージしソートしたい

(defun MERGEALIST (K L) 
    (cond ((and (eq nil K) (eq nil L)) nil) 
     ((eq nil K) L) 
     ((eq nil L) K) 
     ((<= (car (car K)) (car (car L))) 
     (cons K (MERGEALIST (cdr K) L))) 
     ((> (car (car K)) (car (car L))) 
     (cons L (MERGEALIST K (cdr L)))))) 

関数の入力KLは連想リストをソートされます。 例えば、

K((1 . a) (3 . c) (5 . e))

L((2 . b) (4 . d))あります。

結果は((1 . a) (2 . b) (3 . c) (4 . d) (5 . e))と予想されます。

しかし、結果は全く異なります。 なぜこの結果が出ていますか?ありがとう。

+0

最後の2つのケースの '(cons k ...)'と '(cons l ...)'を '(cons(car k)...)'と '(cons(car l) )...) '。 – jkiiski

+0

私はあなたの以前の質問でこれに対する答えを得ていると確信しています:http://stackoverflow.com/q/36457071/1281433。ここで受け入れた答え(標準関数** merge **を使用する)は、[回答](http://stackoverflow.com/a/36459061/1281433)に記載されています(免責事項、それは私の答えです) 。 –

+0

@ JoshuaTaylor:MERGEの回答は、さらに追加されます。私は特に最初の部分で彼のコードで彼の質問に答えました。彼の質問は、既存の関数がどのような問題を解決するのかということではなく、コードをどのように働かせるかということでした。 –

答えて

2

少し簡素化できます。主な変更はjkiiskiからのコメントのようです。

CL-USER 5 > (defun MERGEALIST (K L) 
       (cond ((and (null K) (null L)) nil) 
        ((null K) L) 
        ((null L) K) 
        ((<= (caar K) (caar L)) 
        (cons (car K) (MERGEALIST (cdr K) L))) 
        ((> (caar K) (caar L)) 
        (cons (car L) (MERGEALIST K (cdr L)))))) 
MERGEALIST 

CL-USER 6 > (mergealist '((1 . a) (3 . c) (5 . e)) '((2 . b) (4 . d))) 
((1 . A) (2 . B) (3 . C) (4 . D) (5 . E)) 

組み込み関数mergeはそれをしない:ここで

CL-USER 9 > (merge 'list 
        '((1 . a) (3 . c) (5 . e)) 
        '((2 . b) (4 . d)) 
        #'< 
        :key #'car) 
((1 . A) (2 . B) (3 . C) (4 . D) (5 . E)) 
0
(cons K (MERGEALIST (cdr K) L)) 

あなたの計算の "休息" の前で完全リストKを置きます。

(defun merge-alists (k l) 
    (cond 
    ;; Common case first, if both alists are not empty, then select 
    ;; the first element of that alist, whose car is less. Then, recurse. 
    ((and (consp k) (consp l)) 
     (if (<= (caar k) (caar l)) 
      (cons (car k) (merge-alists (cdr k) l)) 
      (cons (car l) (merge-alists k (cdr l))))) 
    ;; One of the alists is empty, use either the not-empty one or ... 
    ((consp k) k) 
    ;; ... just the other (when k is empty or both are empty) 
    (t l))) 

:あなたはたくさんのことを簡素化することができ、ノート

(cons (car K) (MERGEALIST (cdr K) L)) 

けれども:あなただけ(あなただけLの最初の要素「の前に」するためにテストすることを)それの最初の要素をしたいですすでに、Uを指摘したように、(最後の2つのcond条項が(t (or k l))に簡素化することができた...それは明らかに理解できることが少しも簡潔である可能性があります。)

かse merge

関連する問題