2013-05-30 3 views
0

하위 문제 b에 원래 해결책을 입력했을 때. SICP에서 운동 2.29의 :SICP 연습 문제 2.29 혼란

(define (total-weight m) 
    (let ((left (left-branch m)) 
     (right (right-branch m))) 
    (cond ((null? m) 0) 
      ((not (pair? m)) m) 
      (else 
      (+ (total-weight (branch-structure left)) 
       (total-weight (branch-structure right))))))) 

다음과 같은 데이터로 테스트 :

인터프리터 (MIT/GNU 제도)의 내용으로 에러보고
(define left1 (make-branch 5 8)) 
(define right1 (make-branch 7 10)) 
(define m1 (make-mobile left1 right1)) 
(define right2 (make-branch 1 3)) 
(define m2 (make-mobile left2 right2)) 
(define left0 (make-branch 12 m1)) 
(define right0 (make-branch 5 m2)) 
(define m0 (make-mobile left0 right0)) 
(total-weight m0) 

"에 첫 번째 인수로 전달 된 개체 3, cdr이 올바른 유형이 아닙니다. " 내가 표현 다음 코드로

(let ((left (left-branch m)) 
     (right (right-branch m))) 
    ...) 

을 제거 때 :

(define (total-weight m) 
    (cond ((null? m) 0) 
     ((not (pair? m)) m) 
     (else 
     (+ (total-weight (branch-structure (left-branch m))) 
      (total-weight (branch-structure (right-branch m))))))) 

프로그램은 괜찮 았는데 내가 혼란 가지고

;Value: 27 

결과를 출력한다. 아무도이 문제에 대해 재판을하고 나를 도울 수 있습니까?

+0

두 버전은 동일합니다. –

+0

@Will 'let'을 사용하는 버전에서 'm'은 테스트 전에 사용됩니다. –

+0

@ TeerDe. 나는 이제 내 겸손한 파이를 먹을거야. :) –

답변

4

문제는 당신이 m 모바일을 나타냅니다 여부를 확인하기 전에 첫 번째 버전에서, (left-branch m)(right-branch m) 가 호출 될 것입니다. 즉 m은 또는 nil 일 수 있습니다.

+0

그것은 이해가된다! 당신의 도움이 없었다면, 'let'에 대한 나의 이해가 결여되어 있음을 발견하는 것이 오랜 기간이었을 것입니다. 너무나 따뜻한 마음으로 고마워! :-) –