我试图通过人工智能范式学习常见的口齿不清。本书中的一个练习是定义一个函数,该函数将返回给定列表的姓氏而没有特定的后缀或单词。作为一个例子,如果列表包含bruce banner,phd它将返回banner。这是我的解决方案,但无论是否是后缀
,这仍然会返回最后一个元素(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)))
我不确定我是否遗漏了姓氏函数中的任何内容,或者我的逻辑是否错误。任何帮助是极大的赞赏! 抱歉,如果文字很长,那是我的第一篇文章,我不确定我应该包含哪些细节。
谢谢。
答案 0 :(得分: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))))