勉強ノート - SICP(2)
問題1.8を解いたよー。ついカッとなってめちゃイケ見ながら。
;; ;; square ;; 平方数を求める ;; (define (square x) (* x x)) ;; ;; cubic ;; 立方数を求める ;; (define (cubic x) (* x x x)) ;; ;; improve ;; ニュートン法を使って、より良い立方根の近似解を求める ;; (define (improve guess x) (/ (+ (/ x (square guess)) (* 2 guess)) 3)) ;; ;; good-enough? ;; 解として適当か判定する ;; (define (good-enough? guess x) (< (abs (- (/ (cubic guess) x) 1)) 0.001)) ;; ;; croot-iter ;; 再帰呼び出しされる。立方根を求めるための処理。 ;; (define (croot-iter guess x) (if (good-enough? guess x) guess (croot-iter (improve guess x) x))) ;; ;; curic-root ;; 立方根を求める ;; (define (cubic-root x)(croot-iter 1.0 x))
次にテスト結果。
(cubic-root 27) 3.0000005410641766 (cubic-root 0.0001) 0.046419202576589325 (cubic-root (^ 2 42)) 16384.048557661703
Google先生の回答は順に3, 0.0464158883, 16384なので、大丈夫そう。