首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何判断球拍中两组内容是否相等(不考虑顺序)?

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

Stack Overflow用户
提问于 2015-05-30 09:19:46
回答 5查看 2K关注 0票数 5

我有一个家庭作业问题,要求我判断两组内容是否相等,而不考虑顺序。

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

到目前为止,我已经得到了这个代码,

代码语言:javascript
复制
(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仍然有数据,使最终输出为假。

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

谁能给我一些关于如何解决这个问题的提示?

EN

Stack Overflow用户

发布于 2019-06-12 15:45:31

Ben Rudgers使用list->set的解决方案是最好的。

但是我们可以通过最小的改变来解决问题:

代码语言:javascript
复制
(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) 
          ; compare rest of list1 with rest of list2
          (set-equal? (rest list1) (remove (first list1) list2))
          ; if (first list1) is not a member of list2 then they are not equal
          #f)]))

现在它可以工作了,但我们可以做得更好:

代码语言:javascript
复制
(define (set-equal? list1 list2)
  (cond
    [(and (empty? list1) (empty? list2)) true]
    [(and (cons? list1) (empty? list2)) false]
    [(and (empty? list1) (cons? list2)) false]
    [else ; the last condition always true when first 3 are not
      (and (member (first list1) list2) 
           (set-equal? (rest list1) 
                       (remove (first list1) list2)))]))

现在我们可以去掉一些条件,用if代替cond

代码语言:javascript
复制
(define (set-equal? list1 list2)
  (if (empty? list1)
      (empty? list2)
      (and (member (first list1) list2) 
           (set-equal? (rest list1)
                       (remove (first list1) list2)))))

注意:由于性能不佳,不会在实际项目中使用它。

票数 0
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30541230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档