比较两个列表(作为集合)

时间:2013-10-11 21:32:13

标签: list scheme equals

我正在尝试检查两个列表是否具有相同的元素(即,当它们被视为集合时它们是相同的)。如,

(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)))

这段代码出了什么问题?

1 个答案:

答案 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