2013-03-07 108 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