問題1.45 – SICP(計算機プログラムの構造と解釈)その23
2008年11月27日
問題1.45
(define (average-damp f)
(lambda (x) (average x (f x))))
(define (compose f g)
(lambda (x) (f (g x))))
(define (repeated f n)
(if (= n 1)
(lambda (x) (f x))
(compose f (repeated f (- n 1)))))
(define tolerance 0.00001)
(define (fixed-point f first-guess)
(define (close-enough? v1 v2)
(< (abs (- v1 v2)) tolerance))
(define (try guess)
(let ((next (f guess)))
(if (close-enough? guess next)
next
(try next))))
(try first-guess))
n
乗根の計算に必要な平均緩和の回数を次の手続きで調べる。
(define (n-th-sqrt x n c)
(fixed-point ((repeated average-damp c) (lambda (y) (/ x (expt y (- n 1)))))
1.0))
;3乗根には1回の平均緩和
(n-th-sqrt (expt 3 3) 3 1)
gosh> 2.9999972321057697
;4乗根には2回の平均緩和
(n-th-sqrt (expt 3 4) 4 2)
gosh> 3.000000000000033
;5乗根には2回の平均緩和
(n-th-sqrt (expt 3 5) 5 2)
gosh> 3.0000008877496294
;6乗根には2回の平均緩和
(n-th-sqrt (expt 3 6) 6 2)
gosh> 2.999996785898161
;7乗根には2回の平均緩和
(n-th-sqrt (expt 3 7) 7 2)
gosh> 3.0000041735235943
;8乗根には3回の平均緩和
(n-th-sqrt (expt 3 8) 8 3)
gosh> 3.0000000000173292
;9乗根には3回の平均緩和
(n-th-sqrt (expt 3 9) 9 3)
gosh> 2.9999993492954617
;10乗根には3回の平均緩和
(n-th-sqrt (expt 3 10) 10 3)
gosh> 2.9999982624745742
;11乗根には3回の平均緩和
(n-th-sqrt (expt 3 11) 11 3)
gosh> 3.000002135562327
;12乗根には3回の平均緩和
(n-th-sqrt (expt 3 12) 12 3)
gosh> 3.000003243693911
;13乗根には3回の平均緩和
(n-th-sqrt (expt 3 13) 13 3)
gosh> 2.9999967990518366
;14乗根には3回の平均緩和
(n-th-sqrt (expt 3 14) 14 3)
gosh> 2.9999959148601363
;15乗根には3回の平均緩和
(n-th-sqrt (expt 3 15) 15 3)
gosh> 3.000004202219401
;16乗根には4回の平均緩和
(n-th-sqrt (expt 3 16) 16 4)
gosh> 3.0
;17乗根には4回の平均緩和
(n-th-sqrt (expt 3 17) 17 4)
gosh> 2.999999781018786
以上の結果から、n
乗根には log n
回(四捨五入して整数を求める)の平均緩和が必要になると考えられる。
(define (n-th-sqrt x n)
(let ((c (round (/ (log n) (log 2)))))
(fixed-point ((repeated average-damp c) (lambda (y) (/ x (expt y (- n 1)))))
1.0)))
(n-th-sqrt (expt 3 3) 3)
gosh> 3.000001464168659
(n-th-sqrt (expt 3 4) 4)
gosh> 3.000000000000033
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542