2015-01-04 4 views
0

(root list_of_nodes_subtree1 ... list_of_nodes_subtreen)으로 표시된 N 트리의 노드 멤버쉽을 테스트하는 함수가 필요합니다. 예를 들어 트리가 (a (b (c)) (d) (e (f)))이고 노드가 b 인 경우 true 값을 예상합니다.트리의 Lisp 멤버쉽 노드

몇 가지 맵 기능을 시도했지만이 사실을 알 수 없습니다. 나는 꽤 lisp에 새롭다. 어떤 설명은 저에게 세계를 의미 할 것입니다. 우리는 동일한 패키지의 상징을 비교하고 있었기 때문에 내가 대신 equal의 기본적으로 eq을 사용

(defun check (element tree &key (test #'eq)) 
    "The tree is simply a nested list." 
    (cond 
    ;; If the tree is empty 
    ((null tree) 
    nil) 
    ;; If the tree is a list 
    ((listp tree) 
    (or 
    ;; Recurse on the head of the list. 
    (check element (car tree) :test test) 
    ;; Recurse on the tail of the list. 
    (check element (cdr tree) :test test))) 
    ;; If the tree is just a node 
    (t 
    (funcall test element tree)))) 

;; Testing 
(loop for el in '(a b c d e f g) collect 
    (check el '(a (b) (c (d) (e))))) 

참고,하지만 당신은 당신이 원하는 comparaison의 funcion를 사용할 수 있습니다

+1

우리가 일할 수있는 구체적인 예가 있습니까? 그리고 당신은 무엇을 시도 했습니까? 당신의 트리는 어떻게 구성되어 있는가 (구조체, 클래스, 중첩 된리스트, 해쉬 테이블 ...)? – fstamour

+0

(A (B) (C (D) (E))). 중첩 목록에서 작성되었습니다. – JohnS

+0

(defun는 검사 (LX) (COND ((동일 XL) T) (t (리스트 (체크 L 'mapcar 등등 번호 ( 를 추가'# 적용) ) ) ) ) ) (A (B) (C (D) (E))). 중첩 목록에서 작성됩니다. – JohnS

답변

1

것을보십시오.

+0

'(trace check) '를 사용하여 현재 상황을 볼 수 있습니다 : D – fstamour

+1

일반적인 기본 테스트는'eql'입니다. – Svante

+0

@Svante는 좋은 지적을 가지고있다. – fstamour

관련 문제