我正在爲計算機科學類做一個任務,並且遇到了一個障礙。我知道社區反對給家庭作業項目明確的答案,這不是我真正想要的;我期待着走上正確的軌道或思考過程。我會盡量提供儘可能多的信息,以便讓您瞭解我正在處理的事情以及我被阻止的情況。從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)都是非破壞性的。
我已經想出了很多解決方案,但返回的列表甚至沒有接近我想要的。我認爲在這裏列出它們可能會造成混亂。我在問自己正確的問題時遇到了問題,所以我想我會把它提供給每個人看看他們是否能夠提出一個問題,問我還沒有想過。
我很感謝你的見解。
您可以創建列表的副本,還是必須是列表本身,修剪? – Floris 2013-03-07 03:13:46
請花幾分鐘時間來學習[如何格式化Lisp代碼](http://dept-info.labri.u-bordeaux.fr/~idurand/enseignement/PFS/Common/Strandh-Tutorial/indentation.html)。 – danlei 2013-03-07 13:15:13
感謝您的格式鏈接!把我的縮排放在教授指示我們做的事情上......也許我會給他發送同樣的鏈接。 – brandont 2013-03-07 13:49:15