我有一个作业问题,要求我告诉两组内容是否相等,而与顺序无关。
例如:(set-equal? (list 1 2 3) (list 3 2 1))
为true
到目前为止,我已经获得了此代码,
(define (set-equal? list1 list2)
(cond
[(and (empty? list1) (empty? list2)) true]
[(and (cons? list1) (empty? list2)) false]
[(and (empty? list1) (cons? list2)) false]
[(and (cons? list1) (cons? list2))
(if (member? (first list1) list2)
(set-equal? (rest list1) list2)
(set-equal? (rest list1) list2))]))
该代码显然不起作用,因为即使两个列表相等,递归也将导致列表1的(空)和列表2仍具有数据,从而使最终输出为false。
我认为我应该这样处理:
将list1中的数据与list2中的数据进行检查,如果有相等的数据,则将其从两个列表中删除。然后继续检查,直到两个列表都为空(为真)或一个列表为空且其中一个仍具有数据(输出为false)。问题是,我不知道该如何编码。
谁能给我一些有关如何解决此问题的提示?
最佳答案
记忆一下将A
设置为B
的子集意味着什么的数学定义。
A is a subset of B
<=> for all a in A : a is a member of B
数学定义可以用Racket编写,如下所示:
(define (subset? A B)
(for/and ([a A])
(member a B)))
两组
A
和B
之间的相等性定义为: A = B
<=> A is a subset of B and B is a subset of A
Racket 的版本是:
(define (set-equal? A B)
(and (subset A B)
(subset B A)))
但是对于有限集,我们可以做得更好(就速度而言):
For finite sets:
A = B
<=> A is a subset of B and size(A) = size(B)
在 Racket 中:
(define (set-equal? A B)
(and (= (length A) (length B))
(subset? A B)))
关于recursion - 如何判断 Racket 的两组内容是否相同(不考虑顺序)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30541230/