Created
September 26, 2012 05:26
-
-
Save monmon/3786274 to your computer and use it in GitHub Desktop.
SICP q1.46
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ; p.13 1.1.7 sqrt | |
| (define (sqrt x) | |
| (sqrt-iter 1.0 x)) | |
| (define (sqrt-iter guess x) | |
| (if (good-enough? guess x) | |
| guess | |
| (sqrt-iter (improve guess x) | |
| x))) | |
| (define (good-enough? guess x) | |
| (< (abs (- (square guess) x)) 0.001)) | |
| (define (improve guess x) | |
| (average guess (/ x guess))) | |
| (define (square x) (* x x)) | |
| (define (average x y) | |
| (/ (+ x y) 2)) | |
| ; p.38 1.3.3 fixed-point | |
| (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)) | |
| (define tolerance 0.00001) | |
| ; good-enough? : 予測値が十分良好か調べる方法 | |
| ; improve : 予測値を改良する方法を取る手続き | |
| ; | |
| ; 繰り返し改良を行うiterative-improve-iterという手続きを返す | |
| ; lambda使って書こうとしたけど自分自身を呼び出す呼び出し方がわからない | |
| (define (iterative-improve good-enough? improve) | |
| (define (iterative-improve-iter guess) | |
| (if (good-enough? guess) | |
| guess | |
| (iterative-improve-iter (improve guess)))) | |
| iterative-improve-iter) | |
| ; sqrtのgood-enough?は2引数なので | |
| ; sqrtの引数であるxをそのまま内部で使うようにし1引数にする | |
| ; improveも同様に2引数なので変更 | |
| (define (sqrt x) | |
| ((iterative-improve | |
| (lambda (guess) (< (abs (- (square guess) x)) 0.001)) | |
| (lambda (guess) (average guess (/ x guess)))) | |
| 1.0)) | |
| ; fixed-pointは | |
| ; close-enough?がgood-enough? | |
| ; tryはiterative-improve-iter | |
| ; nextがfにguessを与えて新たなguessを作るimpoveなので | |
| ; | |
| ; これ、(f guess)を2回やることになるからfが超重い処理だったら前のversionの方が良いのではないだろうか | |
| (define (fixed-point f first-guess) | |
| ((iterative-improve | |
| (lambda (guess) (< (abs (- guess (f guess))) tolerance)) | |
| (lambda (guess) (f guess))) | |
| first-guess)) | |
| (print (fixed-point cos 1.0)) ; 0.739.... |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment