从Scheme功能中删除重复项

从Scheme功能中删除重复项,scheme,racket,Scheme,Racket,我必须在Scheme中的列表上写函数。 如何修复复制 您可以单独测试相等性,而不是将>=作为一个条件,这样每当car lst1等于car lst2时,您就可以保留其中一个,但在递归调用中通过执行以下操作来删除这两个条件: (define (merge-sorted lst1 lst2) (cond ((null? lst1) lst2) ((null? lst2) lst1) ((>= (car lst1) (car lst2)) (c

我必须在Scheme中的列表上写函数。 如何修复复制

您可以单独测试相等性,而不是将>=作为一个条件,这样每当car lst1等于car 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))))
        (else
         (cons (car lst1) (merge-sorted (cdr lst1) lst2)))))
Output:

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

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

等待但是如果两个列表中都有重复的元素,会发生什么呢?我认为,这个过程应该保留这两个元素。@ÓscarLópez在两个列表上都是重复的,你的意思是像合并排序的'13 3 4'3 3 4 5吗?因为我的假设是这两个列表本身是排序的,没有重复。@AlexanderMaru哦,等等。这就是OP想要的。没关系。请注意,合并过程应该保留重复项。如果您真的需要删除它们,那没关系,但是如果您将其用作合并排序的帮助程序,那么最终得到的元素比开始时少是不正确的。
(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)