List 在lisp中从列表中删除元素

List 在lisp中从列表中删除元素,list,lisp,List,Lisp,我正在为一门计算机科学课做作业,遇到了一个难题。我知道社区反对对家庭作业项目给出明确的答案,而这并不是我来这里的真正目的;我希望自己能走上正确的轨道或思考过程。我将尽可能多地提供信息,以便让您了解我正在处理的问题以及我是如何被阻止的 首先,这是对LISP语言的一个非常快速的“介绍”。本课程将带我们学习几种不同类型的语言,让我们深入了解编程的不同方面以及它们的发展历史。因此,项目规则如下: 不能使用任何循环功能;相反,我们必须使用递归 只能使用以下固有功能setq,cons,append,lis

我正在为一门计算机科学课做作业,遇到了一个难题。我知道社区反对对家庭作业项目给出明确的答案,而这并不是我来这里的真正目的;我希望自己能走上正确的轨道或思考过程。我将尽可能多地提供信息,以便让您了解我正在处理的问题以及我是如何被阻止的

首先,这是对LISP语言的一个非常快速的“介绍”。本课程将带我们学习几种不同类型的语言,让我们深入了解编程的不同方面以及它们的发展历史。因此,项目规则如下:

  • 不能使用任何循环功能;相反,我们必须使用递归
  • 只能使用以下固有功能setqconsappendlistequaldefuncarcdrcond
  • 可以创建“帮助函数”,用于在函数条件中创建额外步骤(有点像嵌套条件)
我遇到的问题是,我应该创建一个函数,该函数将列表作为参数,扫描该列表中的重复项,并删除重复项,然后返回列表。因此,如果我传递了一个列表'(abcbadea),它将返回(abcde)

到目前为止,我认为最好创建一个名为list\u member的函数,该函数将元素与列表进行比较,如果元素在列表中,则返回T;如果元素不在列表中,则返回nil

(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_成员返回true时该做什么。保持列表格式的唯一函数是APPEND,因为我处理的是单个元素(在本例中,甚至嵌套列表也被视为元素)。我可以使用的所有列表连接函数(APPEND、CONS、list)都是非破坏性的

我提出了很多解决方案,但返回的列表甚至与我想要的不太接近。我认为把它们列在这里可能会引起混乱。我总是问自己一些正确的问题,所以我想我应该让每个人都知道,他们是否能提出一个我还没有想到的问题


我很欣赏你的见解

你的箱子倒过来了。如果第一个元素在列表的其余部分,则它是重复的,因此您希望忽略它。否则,您需要返回一个列表,其中包含剩余元素的
rem\u 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

您可以创建列表的副本,还是必须对列表本身进行修剪?请花几分钟时间学习。感谢您提供的格式链接!我的缩进是根据教授教我们做的…也许我会给他发送相同的链接。不客气。是的,你的教授绝对不应该教他的学生这种缩进风格。非常感谢你的解释。我在项目中还有几个涉及类似过程的功能。这应该有助于找出它们!