我有一个问题:
例如,我有两个数字列表(list1 3 6 7)和(list2 1 6 4 7)。现在我必须将两者合并为 (list3 1 3 4)。所以 6 和 7 都在列表 1 和列表 2 中。List3 包含只出现一次的所有数字。我希望你明白我的意思,如果不只是问我: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
(???
我知道我必须将第一个 list1 与 list2 中的每个数字进行比较,然后再次递归。但是我该如何编程呢?
这是一个不同的,希望不那么棘手的实现。(它是 O(n),但它要求对两个传入列表进行排序;相比之下,Óscar 的实现不需要排序列表,但它是 O(n²)。
(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)
append-reverse
来自 SRFI 1,所以在球拍中你必须(require srfi/1)
.