为什么我的集合 A 和集合 B return 的 Union 过程只设置 A 而没有其他?

Why does my Union procedure of set A and set B return set A and nothing else?

我正在做 SICP 练习 2.59,它要求 reader 到 "implement the union-set operation for the unordered-list representation of sets"。两个集合的并集 - 表示为 A∪B - 是 A 中、B 中或 A 和 B 中的元素的集合。

这是我为执行此操作而编写的代码:

(define (element-of-set? x set)
  (cond ((null? set) #f)
        ((equal? x (car set)) #t)
        (else (element-of-set? x (cdr set)))))

(define (union a b)
  (cond ((null? a) b)
        ((null? b) a)
        (element-of-set? (car b) a)
          (union a (cdr b))
        (else (cons (car b) a))))

我在赔率和偶数集 (define odds '(1 3 5)) (define evens '(0 2 4 6)) (union odds evens) 上对其进行了测试,当预期输出为 (1 3 5 0 2 4 6) 时得到了 (1 3 5) 的输出。谁能解释为什么我得到这个输出以及如何重写代码以获得预期的输出?

这是一个工作工会程序的例子:

(define (union-set s1 s2) 
   (if (null? s1) 
     s2 
     (let 
       ((e (car s1))) 
       (union-set 
         (cdr s1) 
         (if (element-of-set? e s2) s2 (cons e s2)))))) 

在你的 else 子句中,你没有调用 union 所以你失去了 cdr b 中的所有内容。

也许:

(else (union (cons (car b) a) (cdr b)))

您的代码有两个问题:

  • 第三个条件()你忘记了几个
  • 在最后一个条件下我们也必须调用递归

这应该可以解决问题:

(define (union a b)
  (cond ((null? a) b)
        ((null? b) a)
        ((element-of-set? (car b) a)
         (union a (cdr b)))
        (else (cons (car b) (union a (cdr b))))))

或者,如果您想保留与问题示例输出中完全相同的顺序:

(define (union a b)
  (cond ((null? a) b)
        ((null? b) a)
        ((not (element-of-set? (car a) b))
         (cons (car a) (union (cdr a) b)))
        (else (union (cdr a) b))))