gpt4 book ai didi

lisp - 等价类 LISP

转载 作者:太空宇宙 更新时间:2023-11-03 18:38:30 25 4
gpt4 key购买 nike

我需要为等价类编写程序并获得此输出...

(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))

基本上,集合是一个列表,其中的顺序无关紧要,但元素不会出现超过一次。该函数应接受成对列表(根据某种等价关系相关的元素),并返回一组等价类,而无需使用迭代或赋值语句(例如 doset! 等)。

但是,设置实用程序,例如 set-intersectionset-union 以及消除列表中重复项的函数和内置函数 unionintersectionremove-duplicates 是允许的。

非常感谢!

顺便说一句,这不是一道作业题。我的一个 friend 需要这段代码来解决类似的问题。

最佳答案

这听起来像是一道典型的家庭作业题。

虽然这并不难。

输入列表的简单递归函数就可以了。函数的成分在任务描述中已经提到:简单的集合操作。

如果是家庭作业,则适用:家庭作业问题的典型策略是您必须首先展示您的解决方案尝试。这至少应该是算法的大部分正确表述或几乎可以工作的代码。然后 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))

关于lisp - 等价类 LISP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2758963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com