方案:比较/检查2个列表是否相等

时间:2011-12-05 13:44:46

标签: list scheme equals verification

我正在寻找一个比较或检查2个列表是否相等的函数。

它应该忽略数字顺序和重复的数字......

我已经创建了一个函数来检查一个元素是否是另一个块上列表的一部分,但是现在我遇到了一些问题。

这就是我所拥有的

(define (ispart? x b)
      (cond ((null? b) #f)
            ((= x (car b)) #t)
             (else (ispart? x (cdr b)))))

    (define (check=? c1 c2)


(define (verification-1 c1 c2) 
        (cond((null? c1) 
            #t)
        ((ispart? (car c1) c2) (check=? (cdr c1) c2))))
   (define (verification-2 c1 c2) 
    (cond((null? c2) 
        #t)
  ((ispart? (car c2) c1) (check=? c1 (cdr c2)))))
    (if (equal? (and verification-1 verification-2) #t)
        #t
  (#f)))

我主要遇到条件问题,我正在为第一个列表的每个元素创建一个检查,看它是否属于第二个列表,然后检查第二个列表的每个元素。如果任何元素未通过该检查,那么列表就不同了。

我也尝试了这个,但它不会忽略重复的数字或数字顺序,因此(3 2 1)与(1 2 2 3)不同,我不希望发生这种情况

    (define (lists=? lst1 lst2)
  (cond ((null? lst1) (null? lst2))
        ((null? lst2) #f)
        ((= (car lst1) (car lst2))
         (lists=? (cdr lst1) (cdr lst2)))
        (else #f)))

1 个答案:

答案 0 :(得分:2)

给定一个函数all,它表示如果列表的所有元素都为真,

(define (all l)
   (cond ((null? l) #t)
         ((equal? #f (car l)) #f)
         (else (all (cdr l)))))

并提供ispart?功能,

您可以简单地查看第一个列表中的每个元素是否都通过了第二个列表中的ispart?测试,反之亦然:

(define (set_equal l0 l1)
   (and (all (map (lambda (x) (ispart? x l1))
                  l0))
        (all (map (lambda (x) (ispart? x l0))
                  l1))))