Common lisp 返回common lisp中倒数第二个列表元素
我正试图通过人工智能的范例来学习CommonLisp。书中的一个练习是定义一个函数,该函数将返回给定列表的姓氏,而不带特定后缀或单词。例如,如果列表包含bruce banner,它将返回banner。这是我的解决方案,但是它仍然会返回最后一个元素,不管它是否是后缀Common lisp 返回common lisp中倒数第二个列表元素,common-lisp,Common Lisp,我正试图通过人工智能的范例来学习CommonLisp。书中的一个练习是定义一个函数,该函数将返回给定列表的姓氏,而不带特定后缀或单词。例如,如果列表包含bruce banner,它将返回banner。这是我的解决方案,但是它仍然会返回最后一个元素,不管它是否是后缀 (Defun last-name (name) (if (member (last name) *suffix*) (Last-name (butlast name)) (last name))) 在哪里 (defpa
(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)))
我不确定姓氏函数中是否缺少任何内容,或者我的逻辑是否不正确。非常感谢您的帮助!
抱歉,如果这篇文章太长,这是我的第一篇文章,我不确定应该包括多大程度的细节
谢谢。原因是
last
不返回列表的最后一个元素,而是返回包含最后一个元素的列表。即:
(last '(bruce banner phd))
;; -> (PHD), not PHD
实际上,last
在列表后获取一个可选参数n
,该参数默认设置为1,并返回一个包含第一个参数的最后n
元素的列表(请参见)
因此函数成员
不会返回true
尝试在以下位置更改函数:
(defun last-name (name)
(if (member (car (last name)) *suffix*)
(Last-name (butlast name))
(car (last name))))
非常感谢,这解释了很多