如何从scheme中的两个集合中获取并集?
在继续我上一篇关于intersection()的文章的过程中,我已经按照同样的思路为union编写了一个小代码。输出应该是这样的:(union’((12)(21))((13)(34))——((15)(21)(34))。然而,我的程序的输出并不是我想要的。我认为我的递归或条件需要一些指导。请帮忙。谢谢如何从scheme中的两个集合中获取并集?,scheme,union,racket,set,Scheme,Union,Racket,Set,在继续我上一篇关于intersection()的文章的过程中,我已经按照同样的思路为union编写了一个小代码。输出应该是这样的:(union’((12)(21))((13)(34))——((15)(21)(34))。然而,我的程序的输出并不是我想要的。我认为我的递归或条件需要一些指导。请帮忙。谢谢 (define union (lambda (set1 set2) (let ((newlist '())) (cond ((null? set1) set2)
(define union
(lambda (set1 set2)
(let ((newlist '()))
(cond ((null? set1) set2)
((null? set2) set1)
((eq? (caar set1) (caar set2))
(append newlist (cons (caar set1) (+ (cadr (car set1))(cadr (car set2))))))
(else
(if (> (caar set1) (caar set2))(append newlist (car set1)) (union (cdr set1) set2))
(union set1 (cdr set2)))))))
1) eq?
仅当两个参数是完全相同的对象时才返回true。如果只是比较数字,则需要使用equal?
,或=
2) 即使使用递归,newlist
始终为空,无论您做什么。您只是在最后两个案例中添加了一个空列表
3) 这实际上不是工会。当'(12)
和'(13)
变成'(15)
时,您正在寻找一些特殊的行为
然而,这正是你想要的。考虑到您加入了
,并且单个集合中没有重复项(例如'((1 2)(1 2)(3 4)),我们基于您的列表是预排序的假设进行操作:
(定义(联合集合1集合2)
(条件[(空?设置1)设置2]
[(空?设置2)设置1]
[(相等)(车组1)(车组2))(相反(车组1)
(联合(cdr set1)(cdr set2))]
[(=(caar集合1)(caar集合2))(cons(列表(caar集合1)
(+(地籍集1)
(地籍数据集2)
(联合(cdr set1)(cdr set2))]
[(<(caar set1)(caar set2))(cons(car set1)(联合(cdr set1)
set2)]
[其他(cons(车辆组2)(活接头组1
(cdr set2)))]
逻辑:
1) 一个是空的还是另一个是空的?如果是,请返回相应的集合
2) 一组中的第一个列表是否等于另一组中的第一个列表?如果是这样,(cons)
将共享列表添加到将其余两个集合传递回union的结果上
3) 两个集合的第一个列表中的第一个元素是否相等?如果是这样,(cons)
将包含公共第一个元素和求和的第二个元素的列表返回到将其余两个集合传递回并集的结果上
4) 最后两个步骤执行与第一个步骤类似的操作。取第一个元素较小的集合,(cons)
将其传递到两个集合的结果上,减去刚才提取的列表,返回到union中
您可以通过在重复上绑定本地定义进行优化,但希望这能让您了解您的问题以及可能出错的地方。再说一遍,这不是一个集合并集(在您的另一个问题中:这不是集合交集)。eeh。这就是我的教授给它起的名字。:/谢谢。你的教授把集合中的元素/部分称为什么?当两对完全相等时,这不起作用。(并集“((12)(21))”((21))--“(12)(21))应该是“((12)(22))。非常感谢,为什么?你这个问题的逻辑很奇怪。无论如何,您应该能够根据需要修改和删除案例。我写的代码很容易修改。是的。:)我认为平等吗?语句需要将对的第一个元素与精确的对进行比较。谢谢。他们可能不理解这些并集和交叉点所需要的奇怪逻辑。尝试用具体的例子更新文章(这些输入应该产生这个输出),以便对所有不同的情况有一个全面的了解。非常感谢。我明白了我只是需要一个条件修正。非常感谢。:)
(define (union set1 set2)
(cond [(empty? set1) set2]
[(empty? set2) set1]
[(equal? (car set1) (car set2)) (cons (car set1)
(union (cdr set1) (cdr set2)))]
[(= (caar set1) (caar set2)) (cons (list (caar set1)
(+ (cadar set1)
(cadar set2)))
(union (cdr set1) (cdr set2)))]
[(< (caar set1) (caar set2)) (cons (car set1) (union (cdr set1)
set2))]
[else (cons (car set2) (union set1
(cdr set2)))]))