我有一个作业问题,要求我告诉两组内容是否相等,而与顺序无关。
例如:(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)。问题是,我不知道该如何编码。
谁能给我一些有关解决此问题的提示?
有没有规定必须使用递归?如果没有,您可以执行以下操作:
如果它们的长度不等,则结果为false
。在这种情况下,无需进行任何进一步操作。而且,我们知道一旦找到从左到右的表达式and(expr..)
就会返回。false
false
从文档中:
(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