List 把两张名单合并成一张名单

List 把两张名单合并成一张名单,list,recursion,compare,racket,List,Recursion,Compare,Racket,我有一个问题: 我有两个数字列表,例如(列表1 3 6 7)和(列表2 1 6 4 7)。现在我必须将两者合并到(列表3 1 4)。所以6和7都在列表1和列表2中。清单3包含所有只出现一次的数字。我希望你明白我的意思,如果不只是问我:s! 这是我的开始: (define (diff list1 list2) (cond [(empty? list1) list2] ;; If list1 was empty return directly list2 [(empty? lis

我有一个问题:

我有两个数字列表,例如(列表1 3 6 7)和(列表2 1 6 4 7)。现在我必须将两者合并到(列表3 1 4)。所以6和7都在列表1和列表2中。清单3包含所有只出现一次的数字。我希望你明白我的意思,如果不只是问我:s! 这是我的开始:

(define (diff list1 list2)
  (cond
    [(empty? list1) list2] ;; If list1 was empty return directly list2
    [(empty? list2) list1] ;; If list2 was empty return directly list1
    [else
      (???

我知道我必须首先将列表1与列表2中的每个数字进行比较,然后再进行递归。但是我该如何编程呢?

这里有一个不同的实现,希望不那么棘手。(它是O(n),但需要对两个传入列表进行排序;相比之下,Óscar的实现不需要排序列表,但它是O(n²)


append reverse
来自,因此在球拍中您必须
(需要srfi/1)

s/ordered/sorted/
;)嘿,很好,但是我们从来没有用过“车”或“回路”这样的关键词,所以我想我不允许使用这个:(但真的谢谢你的帮助:)@托比亚斯一世几乎总是以专业策划人编写代码的方式回答问题,而不是以“家庭作业批准”的方式。然而,
car
可能是您课程中的第一个拼写。
(define (diff lhs rhs)
  (let loop ((result '())
             (lhs lhs)
             (rhs rhs))
    (cond ((null? lhs) (append-reverse result rhs))
          ((null? rhs) (append-reverse result lhs))
          (else (let ((a (car lhs))
                      (b (car rhs)))
                  (cond ((< a b) (loop (cons a result) (cdr lhs) rhs))
                        ((< b a) (loop (cons b result) lhs (cdr rhs)))
                        (else (loop result (cdr lhs) (cdr rhs)))))))))
> (diff '(3 6 7) '(1 4 6 7))
(1 3 4)