2017-11-23 9 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의 목록에 함수를 써야합니다. 중복을 어떻게 해결할 수 있습니까?Scheme 함수에서 중복 제거

+0

병합 프로시 저는 중복을 보존해야한다는 것을주의하십시오. 괜찮 으면 제거 할 필요가 있지만 병합 정렬을위한 도우미 프로 시저로 사용하는 경우 시작 부분보다 적은 요소로 끝나는 것은 잘못된 것입니다. –

답변

0

대신 >= 하나 조건을 가지고, 당신은 별도로 (car lst1)(car lst2)에 동일해진다 때마다 평등을 테스트 할 수 있습니다, 당신은 수행하여 그 중 하나를 유지하지만 재귀 호출에 모두 제거합니다 :

(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) 
,536,
+0

감사합니다. @Alexander –

+0

안녕하세요. – assefamaru

+0

기다려주세요! 하지만 두 목록에 요소가 중복되면 어떻게됩니까? 이 절차는 두 가지 요소를 모두 지켜야한다고 생각합니다. –