Lisp list-contains program

问题描述:

我该如何制作一个Lisp程序来检查字符,字符串或数字是否在列表中?Lisp list-contains program

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

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

+1

到目前为止你有什么? – Stephen 2010-07-07 21:19:04

+1

A和X是符号,btw .. – 2010-07-08 07:19:25

您可以使用(find x the-list)如果x是列表或者NIL,如果它不是返回x。

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

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

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

格雷格的解决方案是你应该实现什么。但我想补充一点,如果你没有掌握它,小Schemer是一个很好的介绍这种事情。尝试获取副本,甚至只是在Google图书中打开预览并搜索“成员?”。他们做你期望的事情(也就是说,检查汽车是否平等,如果不是,则在cdr上重现),但他们会追踪它并在每一步向你提问。

这不是一本很长或昂贵的书,但是一旦你读了它,你会对如何解决这类问题有一种自然的感觉。他们都归结为同样的事情,这对于列表等同于问我们是否已经打开空白列表,如果没有,或者使用car或者在cdr上重复发生。

我推荐你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没有办法区分另1例。