2017-09-16 38 views
1

我需要幫助搞清楚我有什麼錯我的代碼中的一員,這是分配問題:CLISP遞歸函數的ATOM返回,如果它是一個列表

寫一個遞歸函數命名MYMEMBER接受一個ATOM (atm)和LIST(lst),如果它是成員,則返回ATOM,否則返回0。 (MYMEMBER ‘D ‘(A B C D E F G) returns => D

ex。 (MYMEMBER ‘H ‘(A B C D E F G) returns => NIL

這是我有:

(defun mymember (atm lst) 
    (cond ((null lst) nil) 
    ((equal atm (car lst)) lst) 
    (t (mymember atm (cdr lst))))) 

礦的回報:

(mymember 'd '(a b c d e f g)) 
; ==> (D E F G) 

如何解決它,所以它只有返回d,而不是返回列表的其餘部分?

+0

樣式/可讀性:添加連字符,不縮寫詞,cond後的換行符(「mymember」=>「my-member」,「atm」=>「atom」,「lst」=>「list」) – coredump

+0

您可以創建兩個字符都爲「foo」的不同字符串。即使它們不是相同的字符串,它們也會保持相同。要測試一個「foo」是否真的在列表中,您不能使用EQUAL,因爲它會識別另一個。我推薦EQL。 (可選的EQ不適用於數字和字符。) – kennytilton

+0

你有一個非常簡單/容易的錯誤,只是盯着它,如果有必要,用鉛筆和紙手執。 Lisp在這裏沒什麼特別的。 – kennytilton

回答

2

查看cond中的第一項,在該項中將原子與列表的第一個元素進行比較。如果匹配,則返回lst。你認爲lst,你已經採取car了,是一個原子?