勉強ノート - 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なので、大丈夫そう。