我有一个问题:我需要查找列表是否等于第二个列表,例如:
(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)))) ====> #f but i need #t
怎么了?
这是我的程序:
(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)))
发布的代码中有几个错误,仅供参考,该程序测试是否有两个lists是相等的,它并不是真正测试两个之间的相等性sets:
(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
……但这行不通,lists明显不同:
(set-eq? '(1 2 3 4) '(4 1 2 3))
=> #f
如果您打算测试两个之间的相等性sets,你必须彻底重新思考算法。这是一个想法:写一个subset?
测试一个列表是否是另一个列表的子集(即:一个列表中的所有元素是否都包含在另一个列表中)的过程,然后测试是否(and (subset? l1 l2) (subset? l2 l1))
是真的,如果发生这种情况,那么根据set平等的定义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)