2010-07-07 7 views
3

문자, 문자열 또는 숫자가 목록에 있는지 확인하는 Lisp 프로그램을 만들려면 어떻게해야합니까?Lisp 목록에 프로그램이 있습니다.

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

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

+1

지금까지 무엇을 가지고 계셨습니까? – Stephen

+1

A와 X는 기호, btw입니다. –

답변

12

당신은 그렇지 않은 경우 x는 목록 또는 NIL에있는 경우 X를 반환 (find x the-list)를 사용할 수 있습니다.

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

숙제이기 때문에 교수님이 알고리즘을 구현하는 것을보고 싶을 것입니다. 이 시도 :

  1. 목록의 를 타고 입력 심볼에 대해 비교합니다.
  2. 동일하면 true를 반환하고 그렇지 않으면 false를 반환합니다. 너 끝났어.
  3. 비어있는 경우 false를 반환하고 그렇지 않으면 false를 반환합니다. 너 끝났어.
  4. 목록의 cdr을 사용하여 # 1로 되풀이합니다.
0

그렉의 솔루션이 구현해야합니다 것입니다 (여기서 자동차가 비어 있지이었고, 비교 기호 아니라는 것을 암시). 그러나 그것을 추가하고 싶다면, 당신이 그것에 머리를 쓰지 않았다면, Little Schemer은 이런 종류의 훌륭한 소개입니다. 사본을 가져 오거나 Google 도서에서 미리보기를 열고 "회원?"을 검색하십시오. 그들은 당신이 기대하는 것을합니다 (즉, 차가 평등한지 확인하십시오, 그렇지 않은 경우 cdr에 재발행합니다). 그러나 그들은 그것을 추적하고 각 단계에서 질문을합니다.

매우 길거나 값 비싼 책은 아니지만 읽은 후에는 이런 종류의 문제에 접근하는 방법에 대해 자연스러운 느낌을 갖게됩니다. 그들은 모두 똑같은 것으로 끓어 내려 간다. 목록은 우리가 빈 목록에 도달했는지 묻고, 그렇지 않다면 차로 뭔가를하거나 cdr에서 되풀이한다.

0

나는 당신에게 position 기능을 권장합니다. 목록에서 요소의 위치를 ​​반환하고 (첫 번째 위치는 0) 그렇지 않으면 NIL을 반환합니다.



position

(position 'a '(1 a 2 d 2 5)) ; 1 
(position 'x '(1 a 2 d 2 5)) ; NIL 
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와 다른 하나의 경우를 구별 할 수있는 방법이 없습니다.

관련 문제