2013-03-07 72 views
3

我正在为计算机科学类做一个任务,并且遇到了一个障碍。我知道社区反对给家庭作业项目明确的答案,这不是我真正想要的;我期待着走上正确的轨道或思考过程。我会尽量提供尽可能多的信息,以便让您了解我正在处理的事情以及我被阻止的情况。从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)都是非破坏性的。

我已经想出了很多解决方案,但返回的列表甚至没有接近我想要的。我认为在这里列出它们可能会造成混乱。我在问自己正确的问题时遇到了问题,所以我想我会把它提供给每个人看看他们是否能够提出一个问题,问我还没有想过。

我很感谢你的见解。

+0

您可以创建列表的副本,还是必须是列表本身,修剪? – Floris 2013-03-07 03:13:46

+0

请花几分钟时间来学习[如何格式化Lisp代码](http://dept-info.labri.u-bordeaux.fr/~idurand/enseignement/PFS/Common/Strandh-Tutorial/indentation.html)。 – danlei 2013-03-07 13:15:13

+0

感谢您的格式链接!把我的缩排放在教授指示我们做的事情上......也许我会给他发送同样的链接。 – brandont 2013-03-07 13:49:15

回答

4

你有你的情况倒退。如果第一个元素在列表的其余部分,它是重复的,所以你想省略它。否则,您想要返回一个包含第一个元素的列表,其中包含其余元素的前面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)) (rem_dup (cdr L))) ; Skip duplicate element 
     (T (cons (car L) (rem_dup (cdr L)))))) ; else include it, and check rest of list recursively 
+0

非常感谢您的解释。我在项目中有几个涉及类似流程的功能。这应该有助于搞清楚它们! – brandont 2013-03-07 13:55:06