如何返回列表的中间元素?

时间:2017-06-07 05:52:01

标签: common-lisp

如何定义返回列表中间元素的函数,假设有奇数个元素?

(all-but-last list)返回除列表的最后一个元素之外的所有元素; (中间列表)返回列表的中间元素

使用" cdr"和#34;所有但最后的"对于“中间”的定义。

1 个答案:

答案 0 :(得分:1)

这可能是一个功课问题,希望您以递归方式解决问题。 您应该尝试区分递归的基本情况,以构建middle的一般定义。此外,我们坚持这个问题,并假设输入列表中总是有奇数个元素。

首先,具有单个元素的列表的中间是什么?

然后,假设您使用cdrall-but-last作为基本结构,请尝试使用这些结构来定义一般情况下的问题。如何使用这些结构将问题减少为递归子问题?如何结合递归结果来产生结果?

例如,尝试使用下一个奇数大小的列表,一个包含3个元素的列表,并尝试查看如何使用基本构造和递归调用找到中间元素。

  

考虑一个包含元素 a,e0,e1,...,en,z 的列表。然后,此列表的中间部分与列表 e0,e1,...,en 的中间部分相同,即删除了第一个和最后一个元素的列表。

你可以从这样的事情开始,并填补空白:

(defun middle (list)
  (if (endp (cdr list))
      ...
      (middle ...)))