2013-10-11 57 views
0

我有一個問題:我需要找到,如果列表等於第二個,例如:方案詞彙表eq?

(set%eq? '(1 2 3) '(1 2 3))  ===> #t 

(set%eq? '(1 2 3) '(2 3 4))  ===> #f 

這樣的例子是在我的計劃是正確的,但是這個人是不是:

有什麼不對? 這是我的計劃:

(define (set-eq? xs ys) 

(cond ((and (null? xs) (null? ys)) #t) 
     ((null? ys) #f) 
     ((eq? (car xs) (car ys)) (set-eq? (cdr xs) (cdr ys))) 
     ((eq? (car xs) (car (reverse ys))) (set-eq? (cdr xs) (cdr (reverse ys)))) 
     (else #f))) 
+2

您是否嘗試過使用'平等的嗎?' –

+0

又該'(設置%EQ? '(1 2 3)'(1 3 2))'返回?顯然,你現在離線了。這是一個不好的禮節,要求不要澄清。 :| –

+0

它應該返回#T,但即使沒有現在該怎麼辦呢.. –

回答

0

有幾個失誤在發佈代碼,僅供參考,程序測試的兩個是否名單是相等的,它不是真正的測試兩個之間的平等:

(define (set-eq? xs ys) 
    (cond ((and (null? xs) (null? ys)) #t) 
     ((or (null? xs) (null? ys)) #f) ; missing case 
     ((equal? (car xs) (car ys)) (set-eq? (cdr xs) (cdr ys))) ; use equal? 
     ; deleted unnecessary case here. Anyway, why are you reversing the list? 
     (else #f))) 

現在,這將工作:

(set-eq? '(1 2 3) '(1 2 3)) 
=> #t 

(set-eq? '(1 2 3) '(2 3 4)) 
=> #f 

(set-eq? (quote ((quote one) (quote two) (quote three))) 
     (quote ((quote one) (quote two) (quote three)))) 
=> #t 

我ñ事實上,這會工作,太:

(equal? '(1 2 3) '(1 2 3)) 
=> #t 

(equal? '(1 2 3) '(2 3 4)) 
=> #f 

(equal? (quote ((quote one) (quote two) (quote three))) 
     (quote ((quote one) (quote two) (quote three)))) 
=> #t 

...但是這不會工作,名單顯然是不同的:

(set-eq? '(1 2 3 4) '(4 1 2 3)) 
=> #f 

如果您打算測試兩個之間的平等,你必須徹底重新思考算法。這裏有一個想法:寫一個subset?程序,測試,如果一個列表是另一個列表的子集(即:如果在一個列表中的所有元素都包含在其他列表),然後測試(and (subset? l1 l2) (subset? l2 l1))是否屬實,如果出現這種情況,那麼他們就等於根據設定的定義相等。從OP的評論

+0

從名字上來看,它是一套平等OP是後,大概。因此,企圖反向比較......不幸的是,他們是脫機的。 :| –

+0

@WillNess,但在問題OP中指出「我需要找到_list_等於第二個」。這很難說,反正這個列表不起作用... –

+0

它是混濁的,是的。 –

0

基地很顯然,這些都是set-eq?

(set-eq? '(a b c) '(c b a)) ; ==> #t 
(set-eq? '(a b c) '(b c a)) ; ==> #t 
(set-eq? '() '())   ; ==> #t 
(set-eq? '(a b) '(a b c)) ; ==> #f 
(set-eq? '(a b c) '(a c)) ; ==> #f 

如果列表是沒有重複一個可以重複第一個列表,試圖找到它在第二位。如果發現我們與兩個沒有匹配的列表進行遞歸。

#!r6rs 
(import (rnrs) 
     (rnrs lists)) 

(define (set-eq? xs ys) 
    (if (null? xs) 
     (null? ys) ; #t if both sets are empty, otherwise #f 
     (let ((cur (car xs)))   
     (and (memq cur ys) ; first element is found 
      (set-eq? <??> (remq <??> <??>)))))) ; recurse without first in both lists 

有辦法讓這個更快。 E.q.哈希第一個列表並重復第二個列表。如果所有匹配和hashtable-size與迭代次數相同,則爲#t。