SICP問題1.8
(define (square x) (* x x)) (define (cubic x) (* x x x)) (define (cbrt-iter guess last-guess x) (if (cbrt-good-enough? guess last-guess) guess (cbrt-iter (cbrt-improve guess x) guess x))) (define (cbrt-good-enough? guess last-guess) (< (abs (/ (- guess last-guess) last-guess)) 0.001)) (define (cbrt-improve guess x) (/ (+ (/ x (square guess)) (* 2 guess)) 3)) (define (cbrt x) (cbrt-iter 1.0 x x))
テスト。
(cbrt 27) ; => 3.0000005410641766 (cbrt 8) ; => 2.000000000012062 (cbrt 10) ; => 2.154434691772293 (cubic 2.154434691772293) ; => 10.000000024234794 (cbrt 1000000000) ; => 1000.0000002636338 (cubic 1000.0000002636338) ; => 1.0000000007909012e9 (cbrt 1.0e12) ; => 10000.000334749247 (cubic 10000.000334749247) ; => 1.0000001004247776e12 (cbrt 0.0001) ; => 0.04641588857275245 (cubic 0.04641588857275245)
ということでOK。