合并没有重复

时间:2018-04-11 12:55:46

标签: scheme racket

我想在方案中实现合并函数但没有重复,这意味着当我有例如(merge '(1 2 8) '(2 5 6))时它应该返回'(1 2 5 6 8)而不是 '(1 2 2 5 6 8)。我当前的代码返回第二个结果:

(define (merge lst1 lst2)
  (cond ((null? lst1) lst2)
        ((null? lst2) lst1)
        ((>= (car lst1) (car lst2))
          (cons (car lst2) (merge lst1 (cdr lst2))))
        (else
         (cons (car lst1) (merge (cdr lst1) lst2)))))

2 个答案:

答案 0 :(得分:1)

cond语句中添加另一个子句以分别处理相等元素的情况:

> (define (merge lst1 lst2)
    (cond ((null? lst1) lst2)
          ((null? lst2) lst1)
          ((> (car lst1) (car lst2))
            (cons (car lst2) (merge lst1 (cdr lst2))))
          ((> (car lst2) (car lst1))
            (cons (car lst1) (merge lst2 (cdr lst1))))
          (else
           (merge (cdr lst1) lst2))))
> (merge '(1 2 8) '(2 5 6))
(1 2 5 6 8)

答案 1 :(得分:0)

由于您使用了球拍标签,我假设您可以使用球拍的功能。在这种情况下,您可以使用set-union执行此操作。 set-union函数对泛型集进行操作,列表满足generic-set?接口。您也可以使用appendremove-duplicates,但set-union只需一次通话即可完成此操作。

如果您还希望对结果列表进行排序,则可以使用sort作为运营商使用<

将所有这些组合在一起得到:

(define (sorted-merge lst1 lst2)
  (sort (set-union lst1 lst2) <))