我正在为计算机科学类做一个任务,并且遇到了一个障碍。我知道社区反对给家庭作业项目明确的答案,这不是我真正想要的;我期待着走上正确的轨道或思考过程。我会尽量提供尽可能多的信息,以便让您了解我正在处理的事情以及我被阻止的情况。从lisp的列表中删除一个元素
首先,这是对LISP语言的一个非常快速的“介绍”。本课程将带领我们学习几种不同类型的语言,让我们深入了解编程的各个方面以及开发历史。因此,项目规则如下:
- 不能使用任何循环函数;相反,必须用递归
- 只能使用下面的固有功能setq,利弊,追加,列表,等于,defun定义,车,CDR,并COND
- 可以创建“帮助功能”,可以用来创建一个额外的步骤在一个函数的条件(有点像一个嵌套cond)
我遇到的问题是,我应该创建一个函数,它将列表作为参数,扫描该列表中的重复项,并删除重复项,并将列表返回。所以如果我通过了一个'(a b c b a d e a)'列表,它会返回(a b c d e)。
到目前为止,我认为最好创建一个名为list_member的函数,该函数将元素与列表进行比较,如果元素在列表中则返回T;如果元素不在列表中,则返回n。
(defun list_member (x L)
(cond ((null L) nil) ;if list L is empty, return NIL
((equal x (car L)) T) ;if element x is in L, return T
(T (list_member x (cdr L))))) ;else, recursively check remainder of L
而且我想在函数中使用它,rem_dup,我已经开始填写以下:
(defun rem_dup (L)
(cond ((null L) nil) ;if list L is empty, return NIL to user
((list_member (car L) cdr L)) (...) ;part I am having trouble with
(T (rem_dup (cdr L))))) ;else, check rest of list recursively
我的问题是,我似乎无法弄清楚,可用的功能,如何将删除重复项的列表放在一起。从本质上讲,我不知道在list_member返回true时该从哪里开始。保持列表格式的唯一函数是APPEND,因为我正在处理单个元素(在这种情况下,即使嵌套列表被视为元素)。我可以使用的所有列表连接函数(APPEND,CONS,LIST)都是非破坏性的。
我已经想出了很多解决方案,但返回的列表甚至没有接近我想要的。我认为在这里列出它们可能会造成混乱。我在问自己正确的问题时遇到了问题,所以我想我会把它提供给每个人看看他们是否能够提出一个问题,问我还没有想过。
我很感谢你的见解。
您可以创建列表的副本,还是必须是列表本身,修剪? – Floris 2013-03-07 03:13:46
请花几分钟时间来学习[如何格式化Lisp代码](http://dept-info.labri.u-bordeaux.fr/~idurand/enseignement/PFS/Common/Strandh-Tutorial/indentation.html)。 – danlei 2013-03-07 13:15:13
感谢您的格式链接!把我的缩排放在教授指示我们做的事情上......也许我会给他发送同样的链接。 – brandont 2013-03-07 13:49:15