List 比较两个列表(作为集合)
我试图检查两个列表是否具有相同的元素(即,当作为集合处理时,它们是相等的)。例如: 它不适用于这样的数字:List 比较两个列表(作为集合),list,scheme,equals,List,Scheme,Equals,我试图检查两个列表是否具有相同的元素(即,当作为集合处理时,它们是相等的)。例如: 它不适用于这样的数字: (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
(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)))
这段代码有什么问题?这是我在评论中建议的,诀窍是使用过程测试列表中元素的成员资格:
(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
顺便说一句,如果两个列表的所有部分都相等,那么它们是相等的。i、 e.
(equal?“(abc)”(abc))=>t
,而(equal?“(abc)”(bca))=>f
。您的代码的工作方式类似于equal?
编写一个子集?
过程,该过程测试一个列表是否是另一个列表的子集(即:如果一个列表中的所有元素都包含在另一个列表中),然后测试(和(子集?l1 l2)(子集?l2 l1))
是否为真,如果出现这种情况,根据平等的定义,它们是平等的。
(set-equal? '(1 2 3 4) '(4 3 2 1))
=> #t