返回常见的lisp中的倒数第二个列表元素

时间:2016-08-06 05:46:48

标签: common-lisp

我试图通过人工智能范式学习常见的口齿不清。本书中的一个练习是定义一个函数,该函数将返回给定列表的姓氏而没有特定的后缀或单词。作为一个例子,如果列表包含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)))

我不确定我是否遗漏了姓氏函数中的任何内容,或者我的逻辑是否错误。任何帮助是极大的赞赏! 抱歉,如果文字很长,那是我的第一篇文章,我不确定我应该包含哪些细节。

谢谢。

1 个答案:

答案 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))))