SICPはスマホに入れると捗る

習っておくと筋が良くなると言われるschemeを勉強しようと思い立ち、SICPを読み始めた。無料で全文公開だし、演習問題も豊富についてるし、非常に有難い。
wgetで全体を落としてスマホの中に突っ込んどけば、どこでも読める。emacsの上で、emacs-w3mを使って読むのも便利。簡単にサンプルコードを試せる。
続きは演習問題の答案

;;;; sicp 
;;; 1.16
(define (fast-expt b n)
  (cond ((= n 0) 1)
        ((even? n) (square (fast-expt b (/ n 2))))
        (else (* b (fast-expt b (- n 1))))))
(define (square x) (* x x))
(define (fast-expt-iter-sub b n ans)
  (cond ((= n 0) ans)
	((even? n)(fast-expt-iter-sub (square b)
				      (/ n 2)
				      ans))
	(else (fast-expt-iter-sub b (- n 1) (* ans b)))))
(define (fast-expt-iter b n)
  (fast-expt-iter-sub b n 1))
(fast-expt-iter 10 3)

;;; 1.30
(define (sum term a next b)
  (define (iter a result)
    (if (> a b) 
        result
        (iter (next a) (+ (term a) result))))
  (iter a 0))

;;; 1.32
(define (accum-rec op unit term init next last)
  (define (accum-rec-step a)
    (if (> a last)
	unit
	(op (term a) (accum-rec-step (next a)))))
  (accum-rec-step init))

(define (accum-it op unit term init next last)
  (define (accum-it-step a result)
    (if (> a last)
	result
	(accum-it-step (next a) (op (term a) result))))
  (accum-it-step init unit))

;;; 1.37
(define (cont-frac n d k)
  (define (step i res)
    ;;(display i) (display " ") (display res) (newline)
    (if (= i 0)
	res
	(step (- i 1) (/ (n i) (+ (d i) res)))))
  (step k 0.0))

;;; 1.38
(define (euler-cf k)
  (define (n i) 1)
  (define (d i)
    (let ((r (remainder i 3)))
      (if (or (= r 0) (= r 1))
	  1
	  (* (+ (quotient i 3) 1) 2))))
  (+ 2 (cont-frac n d k)))

;;; 1.41
(define (double f) (lambda (x) (f (f x))))
(define (inc x) (+ x 1))

;;; 1.42
(define (compose f g)
  (lambda (x) (f (g x))))

;;; 1.43
(define (repeated f n)
  (define (step x i res)
    (if (= i 0)
	res
	(step x (- i 1) (f res))))
  (lambda (x) (step x n x)))

(define (repeated2 f n)
  (define (step g i)
    (if (= i 1)
	g
	(step (compose f g) (- i 1))))
  (step f n))