-1

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

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

这段代码有什么问题?

4

1 回答 1

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
于 2013-10-11T22:58:52.857 回答