SICPを読む(31) 1.3.4(2) Newton法

微分

微分ってホントに小さく分割して傾きを求めるのね。

(define dx 0.00001)

(define (deriv g)
  (lambda (x)
    (/ (- (g (+ x dx)) (g x)) dx)))

微分法 - Wikipedia

まんまですね・・・。これも新たな手続きを生み出してる。

Newton法

で、この微分を使ってNewton法を定義する。

ニュートン法 - Wikipedia

(define (newton-transform g)
  (lambda (x) (- x (/ (g x) ((deriv g) x)))))

(define (newtons-method g guess)
  (fixed-point (newton-transform g) guess))

(define (sqrt x)
  (newtons-method (lambda (y) (- (square y) x))
                  1.0))

(square (sqrt 10)) ; 検算

なんかややこしいが、最終的には1.1.8の様になる。

抽象化を進めたことで、sqrt以外の関数もNewton法で解けるようになった!!

抽象と第一手続き

もっともっと抽象化。ややこしい。

抽象化レベルを選ぶ必要もある。

良い言葉

ひげぽんが言うように良い言葉デス。

「われわれはプログラマとして、プログラムの根底にある抽象を見つけ、より強力な抽象化が出来るよう、その上に構成し、一般化するように努めなければならない」

僕のお気に入りは第一版への全文。MITの学生の話。

「言語の構文に関する細部は忘れ、実の論点ー何が計算したく、問題を扱える部分にどう分解し、部分をどう扱うかーに進める」

括弧なんてどうでもいい。実の論点を話そうゼ!!