2016-08-06 62 views
1

我想通過人工智能的範例學習常見的lisp。書中的練習之一是定義一個函數,該函數將返回給定列表的最後一個名字,而不需要特定的後綴或單詞。作爲一個例子,如果列表中包含bruce橫幅,phd它會返回橫幅。這裏是我的解決方案,但是這仍然會返回的最後一個元素,無論它是否是一個後綴或不返回倒數第二個列表元素在共同的lisp

(Defun last-name (name) 
    (if (member (last name) *suffix*) 
    (Last-name (butlast name)) 
    (last name))) 

其中

(defparameter *suffix* '(MD PHD DR)) 

類似的演習在書中呈現在列表中省略前綴使用'rest'而不是'butlast'並返回第一個元素。這工作得很好。

(defparameter *titles* '(Mr MRS MS SIR MADAM DR ADMIRAL MAJOR GENRAL)) 
(Defun first-name (name) 
    (if (member (first name) *titles*) 
    (first-name (rest name)) 
    (first name))) 

我不知道我是否遺漏了姓氏函數中的任何內容,或者如果我的邏輯不正確。任何幫助是極大的讚賞! 道歉,如果文本很長,這是我的第一篇文章,我不知道我應該包括什麼水平的細節。

謝謝。

回答

2

原因是last確實不返回列表的最後一個元素,而是包含最後一個元素的列表。那就是:

(last '(bruce banner phd)) 
;; -> (PHD), not PHD 

其實,last得到一個可選的參數n名單後,這是默認設置爲1的參數,並返回第一個參數的最後n元素(見manual)的列表。

所以函數member不返回true

嘗試改變的功能:

(defun last-name (name) 
    (if (member (car (last name)) *suffix*) 
     (Last-name (butlast name)) 
     (car (last name)))) 
+0

謝謝你這麼多,很多解釋 – oracle

相關問題