2011-12-05 82 views
1

我在寻找一个比较或检查2个列表是否相等的函数。方案:比较/检查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))) 
+2

所以真的,你想要做的是检查两个_sets_是相等的。这些集合恰好用列表表示,但基本上你正在尝试进行一组比较。这可能会给你提示要搜索什么。 –

+0

是的,我想检查一下,并忽略重复的数字和数字顺序...目前,我仍然对我得到的错误一无所知。 – spacing

+0

没错。开始谷歌搜索“方案集比较”或“方案集相等”的东西。 :-) –

回答

2

给定函数all,它说,如果列表中的所有元素都为真,

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

并给予你的ispart?功能,

你可以简单地看,如果每个ELEM耳鼻喉科在第一个列表通过在第二个列表中ispart?测试,反之亦然:

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