expt
; Exponent Recursive
; requires Θ(n) steps and Θ(n) space
(define (expt b n)
(cond ((= n 0) 1)
(else (* b (expt b (- n 1)))))
)
(expt 2 6) ;Value: 64
; Exponent iterative
; requires Θ(n) steps and Θ(1) space
(define (expt b n)
(define (expt-iter b prod n)
(cond ((= n 0) prod)
(else (expt-iter b (* b prod) (- n 1)))
)
)
(expt-iter b 1 n)
)
(expt 2 6) ;Value: 64
(expt 2 0) ;Value: 1
; Exponent fast
; b^n = (b^n/2)^2 if n is even
; b^n = b * b^(n-1) if n is odd
;
; This has Θ(log n) growth,
; for example for n = 1000, it requires only 14 multiplications
(define (fast-exp b n)
(define (even? n) (= (remainder n 2) 0))
(cond ((= n 0) 1)
((even? n) (square (fast-exp b (/ n 2))))
(else (* b (fast-exp b (- n 1))))
)
)
(fast-exp 2 6) ;Value: 64
(fast-exp 2 5) ;Value: 32