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