gpt4 book ai didi

Lisp 联合函数

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

我不介意承认这是一项让我难过的家庭作业。任何朝正确方向的插入都会很有用。

我需要编写一个函数来返回两个给定列表的并集。我相信我的逻辑是合理的,但 Lisp 语法让我难以自拔。

到目前为止,我的解决方案是这样的。

(defun inList (e L)
(cond
((null L)
nil)
((equal (first L) e)
T)
(T
(inList e (rest L)))))

(defun union2 (L1 L2)
(cond
((null L2)
L1)
((not (inList (first L2) L1))
(append (union2 L1 (rest L2)) (first L2)))
(T
(union2 L1 (rest L2)))))

当我用一个空列表作为第二个参数测试函数时,或者第二个参数是一个列表,其中每个项目都是第一个列表的成员,它工作正常。

然而,当测试时(union2 '(1 2 3) '(4 5 6)) 我得到 6 不是类型列表

我相当确定我的错误在:(append (union2 L1 (rest L2)) (first L2)

此时,(first L2) 显然不是列表。但是,将其写为 ((first L2)) 会给我 Badly formed lambda

正如我所说,任何提示或指示将不胜感激。

最佳答案

您确实需要缩进您的代码。大多数 Lisp 用户都理解以下内容。它自动且正确地缩进,并且在它们自己的行上没有括号。

(defun union2 (L1 L2)
(cond
((null L2) L1)
((not (inList (first L2) L1))
(append (union2 L1 (rest L2))
(first L2)))
(T (union2 L1 (rest L2)))))

所以你认为 (append ... (first L2)) 是个问题?

append 期望列表作为参数。 l2 的第一个元素可能不是列表。

如何列 list ?

  • (append l1 l2 ...) 返回附加列表的列表
  • (cons item l1) 返回一个列表,其中 item 添加到 l1 的前面。
  • (list e1 ...) 返回以项目 e1 ... 作为元素的列表。它需要零个或多个参数。

以上之一应该可以帮助您从一个项目创建一个新列表。

另请注意,附加到列表末尾并不是 Lisp 中的有效列表操作。首选将元素添加到列表的前面。

关于Lisp 联合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20021522/

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