我想在方案中实现合并函数但没有重复,这意味着当我有例如(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)))))
答案 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?
接口。您也可以使用append
和remove-duplicates
,但set-union
只需一次通话即可完成此操作。
如果您还希望对结果列表进行排序,则可以使用sort
作为运营商使用<
。
将所有这些组合在一起得到:
(define (sorted-merge lst1 lst2)
(sort (set-union lst1 lst2) <))