[英]removing an element from a list in lisp
我正在為計算機科學課做作業,我遇到了麻煩。 我知道社區不反對給家庭作業項目提供明確的答案,這不是我在這里的真正目的; 我希望能夠走上正軌或思考過程。 我會嘗試提供盡可能多的信息,以便讓您了解我正在處理的內容以及我是如何被阻止的。
首先,這是對LISP語言的一個非常快速的“介紹”。 本課程將介紹幾種不同類型的語言,讓我們深入了解編程的不同方面以及編程的歷史。 因此,項目規則如下:
我遇到麻煩的部分是我應該創建一個函數,它將列表作為參數,掃描列表中的重復項,並刪除重復項,返回列表。 因此,如果我通過了一個'(abcbadea)列表,它將返回(abcde)。
到目前為止,我認為最好創建一個名為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)都是非破壞性的。
我提出了很多解決方案,但返回的列表甚至都不是我想要的。 我認為在這里列出它們可能會造成混亂。 我問自己正確的問題,所以我想我會把它交給每個人,看看他們是否可以提出一個問題,問我還沒有想到。
我很感激你的見解。
你的案子倒退了。 如果第一個元素在列表的其余部分中,則它是重復的,因此您要省略它。 否則,您希望將包含第一個元素的列表返回到其余的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.