2011-12-05 62 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))))