我正在尝试检查两个列表是否具有相同的元素(即,当它们被视为集合时它们是相同的)。如,
(set-eq? '(1 2 3 4) '(2 3 4))
;=> #f
这不符合这样的数字:
(set-eq? (1 2 3 4) '(4 3 2 1))
;=> #f, but I need #t
这是我的代码:
(define (set-eq? xs ys)
(cond ((and (null? xs) (null? ys)) #t)
((or (null? xs) (null? ys)) #f)
((equal? (car xs) (car ys)) (set-eq? (cdr xs) (cdr ys)))
(else #f)))
这段代码出了什么问题?
答案 0 :(得分:0)
这是我在评论中建议的,诀窍是使用member
程序来测试列表中元素的成员资格:
(define (subset? l1 l2)
(or (null? l1)
(and (member (car l1) l2)
(subset? (cdr l1) l2))))
(define (set-equal? l1 l2)
(and (subset? l1 l2)
(subset? l2 l1)))
现在它可以作为一个在集合之间进行相等性测试的程序:
(set-equal? '(1 2 3 4) '(4 3 2 1))
=> #t