我有一个作业问题,要求我告诉两组内容是否相等,而与顺序无关。

例如:(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)))

两组AB之间的相等性定义为:
     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/

10-14 04:14