2017-11-23 14 views
0
(define (merge-sorted lst1 lst2) 
    (cond ((null? lst1) lst2) 
     ((null? lst2) lst1) 
     ((>= (car lst1) (car lst2)) 
     (cons (car lst2) (merge-sorted lst1 (cdr lst2)))) 
     (else 
     (cons (car lst1) (merge-sorted (cdr lst1) lst2))))) 
Output: 

(merge-sorted '(1 3 4) '(2 4 5)) 
=> '(1 2 3 4 4 5) 

Schemeのリストに関数を書く必要があります。 複製を修正するにはどうすればよいですか? (car lst1)(car lst2)に等しいときにはいつでもScheme関数から重複を削除する

+0

マージプロシージャは重複を保存する必要があることに注意してください。あなたが本当にそれらを削除する必要がある場合は、それはマージソートのためのヘルパープロシージャとしてこれを使用している場合は、最初よりも少ない要素で終わることは間違っています。 –

答えて

0

代わり>=一つとしての条件を有していると、あなたが別途平等をテストすることができ、それによって、あなたがそれらのいずれかを維持するが、実行して、再帰呼び出しの両方を削除します:

(cons (car lst1) 
     (merge-sorted (cdr lst1) (cdr lst2))) 

たとえば:

(define (merge-sorted lst1 lst2) 
    (cond 
    ((null? lst1) lst2) 
    ((null? lst2) lst1) 
    ((> (car lst1) 
     (car lst2)) 
    (cons (car lst2) 
      (merge-sorted lst1 (cdr lst2)))) 
    ((< (car lst1) 
     (car lst2)) 
    (cons (car lst1) 
      (merge-sorted (cdr lst1) lst2))) 
    (else 
    (cons (car lst1) 
      (merge-sorted (cdr lst1) (cdr lst2)))))) 

は、あなたが持っているでしょう:

(merge-sorted '(1 3 4) '(2 4 5)) 
=> '(1 2 3 4 5) 
+0

ありがとう@アレクサンダー –

+0

あなたは大歓迎です:) – assefamaru

+0

待って!両方のリストに要素が重複しているとどうなりますか?この手順では、両方の要素を維持する必要があります。 –

関連する問題