프로그램은 목록에서 특정 기호 다음에 나오는 각 기호를 찾습니다. 함수는 전달 된 매개 변수를 가져옵니다. 중첩 목록과 심볼을 포함 할 수있는 목록. 이 함수는 목록을 검색하여 주어진 심볼을 검색하고 주어진 심볼 다음에 오는 심볼을 인쇄해야합니다.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)
문제는 내 단점 문에 아마 내가이 문제를 해결 할 수없는입니다.
좋은 디버깅 기능이있는 일반적인 lisp 구현을 사용하십시오 (예 : [SBCL] (http://sbcl.org/) 또는 [Clisp] (http://www.clisp.org/) ...)에서 이러한 디버깅 기능을 사용하는 방법을 배웁니다. BTW, Lisp는 보통 * 문장이 아닌 * expressions *을 사용합니다 * –
문제는 목록에서 심볼을 식별 한 후입니다. 나는 그 목록 옆에있는 심볼을 찾는다.하지만 심볼이리스트의 마지막 심볼이라면 그 옆에 심볼이 없기 때문에 빈리스트는 Nil을 반환한다. – Mark
디버깅 기능을 사용하는 방법을 배우십시오. –