2014-11-02 6 views
0

프로그램은 목록에서 특정 기호 다음에 나오는 각 기호를 찾습니다. 함수는 전달 된 매개 변수를 가져옵니다. 중첩 목록과 심볼을 포함 할 수있는 목록. 이 함수는 목록을 검색하여 주어진 심볼을 검색하고 주어진 심볼 다음에 오는 심볼을 인쇄해야합니다.LISP 프로그램은 약간의 개조가 필요하지 않습니다.

예 : 지금까지

(find-all 'a '((b a) ((c a b)))) --> (c b) 
(find-all 'a '(b (a a) c)) --> (a c) 
(find-all 'a '(b d c e)) --> nil 

내 코드 :

(defun find-all (a list) 
    (if (consp list) 
     (if (consp (car list)) 
      (find-all a (car list)) 
     (if (eq a (car list)) 
      (cons (car(cdr list)) (find-all a(cdr list))) 
      (find-all a(cdr list)))))) 

이 코드가 찾고있는 기호가 목록의 마지막 원자 경우를 제외하고 작동합니다.

(find-all 'a '((b a) ((c a b)))) --> (c b) 
(find-all 'a '(b (a a) c)) --> (a c) 

을하지만, 이러한 경우에 잘 작동 : 는 이러한 테스트 케이스에 실패

(find-all 'a '(b a c a e)) --> (c e) 

문제는 내 단점 문에 아마 내가이 문제를 해결 할 수없는입니다.

+1

좋은 디버깅 기능이있는 일반적인 lisp 구현을 사용하십시오 (예 : [SBCL] (http://sbcl.org/) 또는 [Clisp] (http://www.clisp.org/) ...)에서 이러한 디버깅 기능을 사용하는 방법을 배웁니다. BTW, Lisp는 보통 * 문장이 아닌 * expressions *을 사용합니다 * –

+0

문제는 목록에서 심볼을 식별 한 후입니다. 나는 그 목록 옆에있는 심볼을 찾는다.하지만 심볼이리스트의 마지막 심볼이라면 그 옆에 심볼이 없기 때문에 빈리스트는 Nil을 반환한다. – Mark

+0

디버깅 기능을 사용하는 방법을 배우십시오. –

답변

0

코드가 맞다고 생각하지 않습니다. 우선, 정확하게 들여 쓰기가 어렵 기 때문에 읽을 수 없습니다. 올바른 들여 쓰기는 다음과 같아야합니다.

(defun find-all (a list) 
    (if (consp list) 
     (if (consp (car list)) 
      (find-all a (car list)) 
      (if (eq a (car list)) ; if properly intended here 
       (cons (car(cdr list)) (find-all a(cdr list))) 
       (find-all a(cdr list))))))))) 

그 후에도 논리를 따르는 데 문제가 있습니다. 예를 들어, 어떤 것이 죄수 인 경우 carcdr을 모두 처리해야하지만 처리하지 않아야합니다. 나는 디버깅 과정을 거치지 않았지만 꼭해야만한다.


대신, 나는 당신에게 대안을 보여주고 싶습니다. 나는이 개 부분에서 문제를 분할 제안 : 우리가 중첩 된 목록으로 시작하지만 단순 목록으로 끝낼 때문에 목록을

평탄화

먼저 목록을 평평하게하는 것이 더 쉽습니다. 여기에 클래식 한 패턴 화 된 기능입니다 : 단순 목록으로

이제 단순 목록을 처리

(defun flatten (sxp) 
    (labels 
    ((sub (sxp res) 
     (cond 
     ((null sxp) res) 
     ((consp sxp) (sub (car sxp) (sub (cdr sxp) res))) 
     (t   (cons sxp res))))) 
    (sub sxp nil))) 

, 나머지는 분명하게, 내 기능 find-frommember 기능을 사용하여 (그리고 호출하면 구별하기 REPL에서 당신) :

(defun find-from (a lst) 
    (labels 
     ((sub (lst) 
     (when lst 
      (let ((rst (cdr (member a lst)))) 
      (when rst 
       (cons (car rst) (sub rst))))))) 
    (sub (flatten lst)))) 

테스트

? (find-from 'a '((b a) ((c a b)))) 
(C B) 
? (find-from 'a '(b (a a) c)) 
(A C) 
? (find-from 'a '(b d c e)) 
NIL 
? (find-from 'a '(b a c a e)) 
(C E)