1.3.4 Procedures as Returned Values
タイトル修正。
lambda
前準備
(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))
(define (deriv g)
(lambda (x)
(/ (- (g (+ x dx)) (g x))
dx)))
(define dx 0.00001)
(define (newton-transform g)
(lambda (x)
(- x (/ (g x) ((deriv g) x)))))
(define (newtons-method g guess)
(fixed-point (newton-transform g) guess))
(define (average-damp f)
(lambda (x) (average x (f x))))
(define (average x y)
(/ (+ x y) 2))
1.40
(define (cubic a b c)
(lambda (x) (+ (* x x x)
(* a x x)
(* b x)
c)))
1.41 (関数を2回適用する関数を返す関数)
(define (double proc)
(lambda (arg)
(proc (proc arg))))
1.42 (compose)
(define (compose f g)
(lambda (x)
(f (g x))))
1.43
(define (repeated f n)
(if (= n 0)
(lambda (x) x)
(compose f (repeated f (- n 1)))))
1.44
(define (smooth f)
(lambda (x)
(/ (+ (f (- x dx))
(f x)
(f (+ x dx)))
3)))
(define (smoothed f n)
((repeated smooth n) f))
1.45
(define (nth-root x n m)
(fixed-point ((repeated average-damp m) (lambda (y) (/ x (expt y (- n 1)))))
1.0))
1.46 (最後の抽象化)
(define (iterative-improve good-enough? improve-guess)
(define (guess-until-good-enough guess)
(if (good-enough? guess)
guess
(guess-until-good-enough (improve-guess guess))))
guess-until-good-enough)
(define (sqrt x)
((iterative-improve (lambda (guess) (< (abs (- (* guess guess) x)) 0.001))
(lambda (guess) (average guess (/ x guess))))
1.0))
(define (fixed-point f first-guess)
((iterative-improve (lambda (guess) (< (abs (- guess (f guess))) 0.00001))
f)
first-guess))抽象化完了。