2009-10-29 3 views
2

방금이 책을 재미있게 익히기 시작했습니다. 나는 그것이 숙제 였으면 좋겠지 만, MIT에 참석할 여유가 없으며, 어쨌든 나보다 더 똑똑한 사람들이 수없이 많습니다. : PSICP 운동 1.16, 내 버그는 바로 나에게 보이기 때문에.

빠른 경험치가 B를 발견하도록되어^N, 즉 4^2 = 16, 3^3 = 27 당신은 빠르게 EXP 전화 깜빡

(define (fast-exp b n) 
    (define (fast-exp-iter n-prime a) 
    (cond ((= n-prime 1) a) 
      ((= (remainder n-prime 2) 1) (fast-exp-iter (- n-prime 1) (* a b))) 
      (else (fast-exp-iter (/ n-prime 2) (* a b b))))) 
    (fast-exp-iter n 1)) 

fast-exp 4 2; Expected 16, Actual 2 
+0

스타일 노트 (A는 처음에 1 "불변 양"(A * B를^N)를 사용하여 반복적 인 과정) 정확히 SICP 저자에 의해 어떤 것으로 예상된다됩니다 솔루션을 작업의 예를 제공 할 수 있습니다. .. 나는 당신이 C 구문에 익숙하다고 생각합니다. 닫는 괄호를 묶기 원할 것입니다, 그것은 그렇게 멋지게 보일 것입니다. Scheme에서 대괄호를 사용할 수도 있습니다. cond (cond [(= n-prime 1) a] ...) ... –

+0

나는 들여 쓰기와 괄호를 고칠 자유를 취했습니다. – Svante

+0

팁을위한 @omouse 시원한 감사! – Dave

답변

5

. 대신 세 개의 별개 원자를 평가했습니다. 실제로 2의 빠른 실행을 평가하려면

(fast-exp 4 2) 
+0

하하하! 많은 감사 – Dave

2

여기에 적어 놓은 해결책도 올바르지 않습니다. 예 : 체크 아웃하십시오 (fast-exp 2 6). 예상 : 64, 실제 : 32.

1

해결 방법이 잘못되었습니다. (http://ideone.com/quT6A를보십시오) 사실, 당신은 원칙적으로 두 개의 숫자만을 인자로 전달하는 tail-recursive fast exponentiation을 어떻게 작성할 수 있습니까? 계산의 중간에 이상한 지수를 만나면 어떤 승수를 사용해야할지 모르기 때문에 심지어 가능하다고 생각하지 않습니다. 하지만

(define (pow x y) 
    (define (powi acc x y) 
    (cond 
     ((= y 0) acc) 
     ((odd? y) (powi (* acc x) x (- y 1))) 
     (else (powi acc (* x x) (/ y 2))))) 
    (powi 1 x y))