2017-10-05 2 views
-1

요소 N이 트리 트리에 있는지 확인하는 함수를 Lisp에 작성해야합니다.요소가 트리에 있는지 확인하십시오.

(defun TREE-CONTAINS (N TREE) 
    (cond ((equal TREE nil) nil) 
     ((listp (CAR TREE)) (or (TREE-CONTAINS(N (CAR TREE))) 
           (TREE-CONTAINS(N (CDR TREE))))) 
     (t (cond ((equal N (CAR TREE)) t) 
        (t TREE-CONTAINS(N (CDR TREE))))) 
    ) 
) 

예를 들어 (TREE-CONTAINS (1 ((1 2 3) 4 5)))이 true를 반환합니다. 하지만이 예제 코드를 테스트 할 때 "((2 3)) 인수가 호출 된 정의되지 않은 함수 N"오류 메시지가 나타납니다. (TREE-CONTAINS 2 '(1 2 3)). 물론 N은 1이되어야하지만 N이 함수라고 생각하는 이유를 모르겠습니다. 어떤 생각?

+0

SO에는 '{}'로 코드 서식이 지정되어 있으며 텍스트 내에 코드를 넣을 수 있습니다 (예 : backticks). ''''''''명령을 내려야합니다. 이름 주위에 괄호를 넣으면 함수라고 부릅니다. '(+ 1 2)'는'+'를 호출합니다. '(N (CDR TREE))'이 어떻게 하겠지만'N '을 부르려고합니까? – Sylwester

+0

고마워, 너 무슨 뜻인지 알 겠어. 그러나 CDR TREE 주변의 괄호를 제거하면 언 바운드 CDR이 생깁니다. – user112358

+0

'(cdr tree)'가 정확하다고 확신하지만'n'에 대한 인수가 아니 었습니다. 당신은 아마도 algol 언어에 익숙 할 것이므로 Java에서'n (cdr (tree)) '과 비슷합니다. 그러나'cdr'은'n'이 아닌 함수입니다. – Sylwester

답변

0

tree-contains 또는 lisp 함수를 호출 할 때 인수 주위에 괄호를 포함하면 안됩니다. 그것은 (function-name arg1 arg2)이 아니고 (function-name (arg1 arg2))이 아닙니다.

그래서 처음에는 과 같이 (tree-contains(n (car tree)))이라는 호출에 대한 괄호를 제거하십시오. 마찬가지로 or 절에있는 tree-contains에 대한 다음 호출에서도 마찬가지입니다. 게다가, 마지막 조건 : (t TREE-CONTAINS(N (CDR TREE)))은 다음과 같이 호출되어야합니다 : (t (tree-contains n (cdr tree))).

관련 문제