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))