如何创建一个Lisp程序来检查字符,字符串或数字是否在列表中?
(list-contains '(1 a 2 d 2 5) 'a) => T
(list-contains '(1 a 2 d 2 5) 'x) => NIL
答案 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)
由于这是家庭作业,您的教授可能希望看到您实施算法。试试这个:
答案 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
无法区分一个案例与另一个案例。