2013-08-20 8 views
0

특정 깊이의 이진 트리를 입력하는 스키마 프로그램을 작성하려고합니다. 예를 들어, 이진 트리의 루트는 1이고 왼쪽 하위 트리의 루트는 2이며 계속 켜져 있습니다. 트리에 깊이가있는 데이터 표현식을 출력하도록해야합니다. 지금은 아래의 코드를 가지고,하지만 난 계속 오류 메시지가 무엇입니까 : 당신은 내가 배우고로 좋은 것 내가 사용하고있는 코드에서 같은 용어를 사용하여이 문제를 설명 할 수있는 경우스키마 이진 트리를 조작하는 방법

Error in null?: expected a list; got '1'. 

을 내가 할 더 큰 표현을 사용하는 법을 모른다.

(define fetch-exp 
    (λ (n bt) 
    (cond [(empty-tree? bt) ▽#f] 
      [(> n (tree-depth (left-tree bt))) ▽#f] 
      [(> n (tree-depth (right-tree bt))) ▽#f] 
      [(one? n) (root bt)] 
      [(> (tree-depth (left-tree bt)) (tree-depth (right-tree bt))) 
      (fetch-exp (left-tree bt) (sub1 n))] 
      [(> (tree-depth (right-tree bt)) (tree-depth (left-tree bt))) 
      (fetch-exp (right-tree bt) (sub1 n))] 
      [else ▽#f]))) 

답변

2

각 어린이의 깊이를 세기는 영원히 그 자체가 나무 순회로 걸릴 것입니다. 또한 잠재적으로 각 측면에 대해 두 번 할 수 있습니다. let 서술문에 결과를 바인딩하는 것이 그렇게하는 것이 좋을 것입니다. (또는 어디에서나 사례 분석을하고 잠재적 인 비싼 평가 결과를 두 번 이상 사용하는 경우). 그렇지 않으면 프로그램을 수정하여 한 번만 평가합니다.

(define (fetch-exp n bt) 
    (cond ((empty-tree? bt) #f) 
     ((= 1 n) (root bt)) 
     (else (or (fetch-exp (sub1 n) (left-tree bt)) 
        (fetch-exp (sub1 n) (right-tree bt)))))) 

너처럼 왼쪽 분기가 내려 간다. 실패 할 경우 또는 스택의 문이 적절한 데이터 항목을 찾거나 트리의 맨 아래 오른쪽 분기에 도달 할 때까지 계속 시도하십시오. 매우 나쁜 경우에는 트리를 한 번 통과하게됩니다. 실제로 비어 있지 않은 트리에서 프로세스를 수행하는 가장 좋은 경우입니다. n이 1인지 확인하기 전에 트리를 걸으십시오.

+0

대단히 감사합니다 "또는"을 사용하지 않고 동일한 함수를 만드는 방법이 있습니다 – Jim

+0

예, 대체 절을 두 절로 바꾸십시오 ((fetch-exp (sub1 n) (왼쪽 트리 bt))) (else (fetch- exp (sub1 n) (right-tree bt))) 한 절의 cond 절은 합법적이며, 절이 거짓이지만 아무 것도 아닌 경우 그 값을 반환하지만,이 또한 약간 추합니다. – WorBlux

2

귀하의 주요 문제는 fetch-exp로 재귀 호출이 인수의 순서를 바꾼 것입니다 코드입니다. (fetch-exp (sub1 n) (left-tree bt))(fetch-exp (sub1 n) (right-tree bt))이어야합니다. 또는 함수의 매개 변수 순서를 (lambda (bt n) ...)으로 변경하십시오.

관련 문제