0

나는 Lisp을 가진 완전한 초보자이므로 나에게 쉽게 간다. 임 배열에 이진 검색 트리를 구현하고 순서대로 출력 할 수 있습니다. 난 좌측 자식 * I는 인덱스 1 루트와 2이 배열이 2 * I + 1 우측 자식 :함수가 실행되지 않는 코드

#(NIL 30 15 50 10 20 NIL 70 3 NIL 17 NIL NIL NIL NIL 80 NIL NIL NIL NIL NIL NIL 
    NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL 
    NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL 
    NIL NIL NIL) 

메신저 순서 출력에서 ​​추출이 기능에 보내기 나무에서 :

(defun inOrder (tree rootIndex) 
    (setq leftI (* rootIndex 2)) 
    (setq rightI (+ leftI 1)) 
    (if (aref tree leftI) 
     (inOrder tree leftI)) 
    (format t "~D," (aref tree rootIndex)) 
    (if (aref tree rightI) 
     (inOrder tree rightI))) 

예상 출력은 3,1015172030507080해야하지만, 나는 3,10,15,30를 얻을. 형식 다음의 코드가 실행되지 않는 것처럼 보입니다. 누구든지 나를 도울 수 있다면 크게 감사 할 것입니다.

+0

는 CL의 이름을 CamelCase를하지 마십시오. 기본적으로 독자는 이스케이프 처리되지 않은 문자를 대문자로 사용합니다. 이것은 당신이 repl에서 'leftU'를 평가하면 'LEFTU'를 볼 수있는 이유입니다. [TLDR 기호는 대소 문자를 구분하지 않습니다.] – Baggers

답변

1

절대 변수로 leftIrightI을 사용하므로 재귀가 의도 한대로 작동하지 않습니다. 대신, let*와 지역 변수로 정의 :

(defun inOrder (tree rootIndex) 
    (let* ((leftI (* rootIndex 2)) 
      (rightI (+ leftI 1))) 
    (if (aref tree leftI) 
     (inOrder tree leftI)) 
    (format t "~D," (aref tree rootIndex)) 
    (if (aref tree rightI) 
     (inOrder tree rightI)))) 
+0

고맙습니다. 일했다 :) – AllAnimals

관련 문제