我正在为计算机科学课程的作业工作, 但遇到了一些问题。我知道社区反对提供明确的家庭作业答案,这也不是我的目的; 我想要被放在正确的轨道上或思考过程中。我将尽可能多地提供信息,以便让您了解我正在处理什么以及我如何受阻。
首先,这是LISP语言非常快速的“介绍”。该课程会引导我们通过几种不同类型的编程语言,帮助我们了解编程的不同方面以及它们发展的历史。因此,项目规则如下:
到目前为止,我认为最好创建一个名为list_member的函数,将元素与列表进行比较,并且如果该元素在列表中,则返回T,如果不在列表中,则返回nil。
我的问题是,我似乎无法通过可用的函数来去除重复项并组合列表。实际上,当list_member返回true时,我不知道该从何处开始做什么。唯一保留列表格式的函数是APPEND,因为我正在处理单个元素(在这种情况下,即使嵌套列表也被视为一个元素)。我可以使用的所有列表连接函数(APPEND、CONS、LIST)都是非破坏性的。
我想出了很多解决方案,但返回的列表与我想要的完全不同。我认为在此列出它们可能会造成混淆。我已经遇到了自己无法回答正确问题的障碍,所以我想向大家提出一个问题,看看他们是否能想出我还没有想到的问题。
感谢您的见解。
首先,这是LISP语言非常快速的“介绍”。该课程会引导我们通过几种不同类型的编程语言,帮助我们了解编程的不同方面以及它们发展的历史。因此,项目规则如下:
- 不能使用任何循环功能; 必须使用递归
- 只能使用以下固有函数 setq, cons, append, list, equal, defun, car, cdr, 和 cond
- 可以创建“辅助函数”,可以用于在函数的条件中创建额外的步骤(类似于嵌套条件)
到目前为止,我认为最好创建一个名为list_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_member返回true时,我不知道该从何处开始做什么。唯一保留列表格式的函数是APPEND,因为我正在处理单个元素(在这种情况下,即使嵌套列表也被视为一个元素)。我可以使用的所有列表连接函数(APPEND、CONS、LIST)都是非破坏性的。
我想出了很多解决方案,但返回的列表与我想要的完全不同。我认为在此列出它们可能会造成混淆。我已经遇到了自己无法回答正确问题的障碍,所以我想向大家提出一个问题,看看他们是否能想出我还没有想到的问题。
感谢您的见解。