我需要为等价类编写一个程序并获得此输出......
(equiv '((a b) (a c) (d e) (e f) (c g) (g h)))
=> ((a b c g h) (d e f))
(equiv '((a b) (c d) (e f) (f g) (a e)))
=> ((a b e f g) (c d))
基本上,A集是一个列表,其中顺序无关紧要,但元素不会出现多次。
该函数应接受一对对象列表(根据某种等价关系相关的元素),并返回一组等价类而不使用迭代或赋值语句(例如do
,set!
等)
但是,设置set-intersection
,set-union
等实用程序以及消除列表和内置函数union
,intersection
和{{1}重复项的函数}} 被允许。
非常感谢!
顺便说一句,这不是一个家庭作业问题。我的一个朋友需要这段代码来解决微笑问题。答案 0 :(得分:4)
这听起来像是一个典型的家庭作业问题。
但这并不困难。
输入列表上的简单递归函数可以。任务描述中已经提到了函数的成分:简单集合操作。
如果是家庭作业,则适用:家庭作业问题的典型策略是您必须首先展示您的解决方案尝试。这应该至少是算法或几乎工作代码的最正确的公式。那么Lispers可能会帮助你完成最后的工作......
好吧,时间过去了,没有解决方案。
所以这是一个使用Common Lisp:
我们需要三个功能。
第一个函数将一对添加到对的集合中。一对是一个列表。对的集合是对的列表。对于这对,我们计算两组:等价的对的集合和不等价的对的集合。我们将与输入对中等价的对组合成一组。
(defun equiv-add (e l)
(let ((l- (remove-if (lambda (i) (intersection e i)) l))
(l+ (remove-if-not (lambda (i) (intersection e i)) l)))
(cons (remove-duplicates (reduce #'union (cons e l+)))
l-)))
第二个函数将每对结果对添加到结果中。它通过调用EQUIV-ADD来添加它们。
(defun equiv-aux (list result)
(if (null list)
result
(equiv-aux (rest list)
(equiv-add (first list)
result))))
第三个函数只用输入集和空结果调用EQUIV-AUX。此外,它会对结果子列表进行排序。
(defun equiv (list)
(mapcar (lambda (el)
(sort el #'string-lessp))
(equiv-aux list '())))
示例电话:
CL-USER 34 > (equiv '((a b) (c d) (e f) (f g) (a e)))
((A B E F G) (C D))
CL-USER 35 > (equiv '((a b) (a c) (d e) (e f) (c g) (g h)))
((A B C G H) (D E F))