簡體   English   中英

從lisp中的列表中刪除元素

[英]removing an element from a list in lisp

我正在為計算機科學課做作業,我遇到了麻煩。 我知道社區不反對給家庭作業項目提供明確的答案,這不是我在這里的真正目的; 我希望能夠走上正軌或思考過程。 我會嘗試提供盡可能多的信息,以便讓您了解我正在處理的內容以及我是如何被阻止的。

首先,這是對LISP語言的一個非常快速的“介紹”。 本課程將介紹幾種不同類型的語言,讓我們深入了解編程的不同方面以及編程的歷史。 因此,項目規則如下:

  • 不能使用任何循環函數; 相反,必須使用遞歸
  • 只能使用以下固有功能setqconsappendlistequaldefuncarcdrcond
  • 可以創建“幫助功能”,可以用來在函數的條件中創建一個額外的步驟(有點像嵌套的cond)

我遇到麻煩的部分是我應該創建一個函數,它將列表作為參數,掃描列表中的重復項,並刪除重復項,返回列表。 因此,如果我通過了一個'(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM