我有一个家庭作业问题,要求我判断两组内容是否相等,而不考虑顺序。
例如:(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))]))这段代码显然不起作用,因为即使两个列表相等,递归也会导致列表1的(空)和列表2仍然有数据,使最终输出为假。
我认为我应该这样做:根据list2中的数据检查list1中的数据,如果有相等的数据,则将其从两个列表中删除。然后继续检查,直到两个列表都为空(给出true),或者一个列表为空而另一个列表仍有数据(输出false)。问题是,我不知道如何编码。
谁能给我一些关于如何解决这个问题的提示?
发布于 2019-06-12 15:45:31
Ben Rudgers使用list->set的解决方案是最好的。
但是我们可以通过最小的改变来解决问题:
(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)]))现在它可以工作了,但我们可以做得更好:
(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
(define (set-equal? list1 list2)
  (if (empty? list1)
      (empty? list2)
      (and (member (first list1) list2) 
           (set-equal? (rest list1)
                       (remove (first list1) list2)))))注意:由于性能不佳,不会在实际项目中使用它。
https://stackoverflow.com/questions/30541230
复制相似问题