Lisp list-contains程序

时间:2010-07-07 21:11:55

标签: common-lisp

如何创建一个Lisp程序来检查字符,字符串或数字是否在列表中?

(list-contains '(1 a 2 d 2 5) 'a) => T

(list-contains '(1 a 2 d 2 5) 'x) => NIL

4 个答案:

答案 0 :(得分:14)

如果x在列表中,您可以使用(find x the-list)返回x,如果不在,则返回NIL。

(find 'a '(1 a 2 d 2 5)) ; A
(find 'x '(1 a 2 d 2 5)) ; NIL

答案 1 :(得分:7)

由于这是家庭作业,您的教授可能希望看到您实施算法。试试这个:

  1. 获取列表的 car 并将其与输入符号进行比较。
  2. 如果相同,则返回true;你已经完成了。
  3. 如果它是空的,则返回false;你已经完成了。
  4. 使用列表的 cdr 递归回#1。 (这里暗示汽车不是空的而不是比较符号)

答案 2 :(得分:0)

Greg的解决方案是你应该实现的。但是我想补充一点,如果你没有头, The Little Schemer 是对这类事情的一个很好的介绍。尝试获取副本,甚至只需在Google图书中打开预览并搜索“会员?”。他们做你期望的事情(也就是说,检查汽车是否相等,如果不是,则重复使用cdr),但他们会追踪并在每一步向你提问。

这不是一本很长或很昂贵的书,但是一旦你阅读它,你就会对如何处理这类问题有一种自然的感觉。它们都归结为同样的事情,对于列表来说,这是否会让我们知道我们是否已经打到空列表,如果没有,可以用汽车做某事或者用cdr重复一次。

答案 3 :(得分:0)

我建议您使用position功能。它返回列表中元素的位置(第一个位置为0),如果不是则返回NIL。

(position 'a '(1 a 2 d 2 5)) ; 1
(position 'x '(1 a 2 d 2 5)) ; NIL  



position优于find。您可以知道列表中的符号'NIL

(position 'NIL '(1 a NIL d 2 5)) ; 2
(position 'NIL '(1 a 2 d 2 5)) ; NIL

然而,

(find 'NIL '(1 a NIL d 2 5)) ; NIL
(find 'NIL '(1 a 2 d 2 5)) ; NIL

因此,使用find无法区分一个案例与另一个案例。