如何判断球拍的两组内容是否相同(不考虑顺序)?

gur*_*ing 5 recursion racket

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

例如:(set-equal? (list 1 2 3) (list 3 2 1))是真的

到目前为止,我已经获得了此代码,

(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))]))
Run Code Online (Sandbox Code Playgroud)

该代码显然不起作用,因为即使两个列表相等,递归也将导致列表1的(空),列表2仍具有数据,从而使最终输出为false。

我认为我应该这样处理:对照list2中的数据检查list1中的数据,如果有相等的数据,则将其从两个列表中删除。然后继续检查,直到两个列表都为空(为真)或一个列表为空且其中一个仍具有数据(输出为false)。问题是,我不知道该如何编码。

谁能给我一些有关解决此问题的提示?

Bru*_*yne 1

有没有规定必须使用递归?如果没有,您可以执行以下操作:

如果它们的长度不等,则结果为false。在这种情况下,无需进行任何进一步操作。而且,我们知道一旦找到从左到右的表达式and(expr..)就会返回。falsefalse

文档中:

(and expr ...) 
Run Code Online (Sandbox Code Playgroud)

如果未提供表达式,则结果为#t。

如果提供单个 expr,则它位于尾部位置,因此 and 表达式的结果是 expr 的结果。

否则,将计算第一个 expr。如果生成 #f,则 and 表达式的结果是 #f。否则,结果与 and 表达式相同,其中剩余表达式位于相对于原始 and 形式的尾部位置。

鉴于它们的长度相等,请按升序对输入列表进行排序(或降序,只要它们都以相同的方式排序)并检查它们是否相等。

(define (set-equal? list1 list2)
  (and (equal? (length list1) (length list2)) (equal? (sort list1 <) (sort list2 <)))
)

(set-equal? (list 1 2 3) (list 3 2 1))
(set-equal? (list 2 1 2) (list 1 2 2))
(set-equal? (list 2 1 2) (list 7 2 2))
Run Code Online (Sandbox Code Playgroud)

输出true true false