有幾個失誤在發佈代碼,僅供參考,程序測試的兩個是否名單是相等的,它不是真正的測試兩個套之間的平等:
(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的評論
您是否嘗試過使用'平等的嗎?' –
又該'(設置%EQ? '(1 2 3)'(1 3 2))'返回?顯然,你現在離線了。這是一個不好的禮節,要求不要澄清。 :| –
它應該返回#T,但即使沒有現在該怎麼辦呢.. –