Skip to content

Instantly share code, notes, and snippets.

@monmon
Created September 26, 2012 05:26
Show Gist options
  • Select an option

  • Save monmon/3786274 to your computer and use it in GitHub Desktop.

Select an option

Save monmon/3786274 to your computer and use it in GitHub Desktop.
SICP q1.46
; 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