本投稿の目的
Structure and Interpretation of Computer Programsを読み始めて二日目。
毎日ログをつけなければサボると思い、日記程度にまとめます。DS勉強してました。Pythonしか書けないです。(書けるといっても、Vibe Coding勢。)(著者はあまりどっぷり何かに浸かったことがない人間。)
〜P35の半分まで終わった。ここを学生時代に表面だけ触れて、わかった気になっていたからダメだなーと思い、根性出して、心底から理解しようと言う感じです。(仕事でも"そんなことも理解できなかったの?"と思われるかもしれないが、勇気を出して聞いてみたいなと思います。。。)
昨日の続き〜課題1.1.7〜
- 1.1.7むずすぎる。。。
練習問題1.1.7
平⽅根の計算に使った good-enough? テストは、と
ても⼩さい数値の平⽅根を求めるのにはあまり効率的ではないだ
ろう。また、実際のコンピュータでは、数値演算はほとんど必ず有
限の有効数字で⾏われることになる。この問題があるので、とて
も⼤きい数に対しては、我々のテストは不適切なものになる。こ
れらの⾔明について、⼩さい数と⼤きい数でテストがうまくいか
ない例を使って説明せよ。good-enough? を実装するためのもうひ
とつの戦略としては、guess が繰り返しごとにどれだけ変化する
かを確認して、差分が推定値に対してとても⼩さいものになった
ら⽌めるというものもある。これは、⼩さい数値や⼤きい数値に
対して、よりうまくいくだろうか。
小さい数・改善案の自分の理解を述べます。
大きい数
day2参照してください。
小さい数
非常に小さい数ではguessアップデートの時にすぐに<0.001を満たしてしまうので、本来の値から見ると誤差はとても大きいのですが、計算を早く打ち切ってしまいます、、
改善案
以下のように実行するべきなのです。(参考参照)
要は答えが十分正しい会中に興味はなく、guessの変化量に興味がある、といった感じでしょうか。
なので、元の方法は答えと問題の差を固定値0.001で測っているが、改善案は反復計算が収束したかを測っています。
(define (good-enough? previous-guess guess)
(< (abs (/ (- guess previous-guess) guess)) 0.00000000001))
練習問題1.8
これはできました!この前のものを参照にしながらですが。
慣れないうちはノートにトレース図を書きながらできるとうまくいきます!
scheme@(guile-user) [3]> (define (improve guess x) (/ (+ (/ x (square guess)) (* 2 guess)) 3))
scheme@(guile-user) [3]> (define (good-enough-cube? prev-guess guess) (< (abs (- prev-guess guess)) 0.000000001))
scheme@(guile-user) [3]> (define (cube-iter guess x) (if (good-enough-cube? guess (improve guess x)) guess (cube-iter (improve guess x) x)))
scheme@(guile-user) [3]> (define (cube x) (cube-iter 1.0 x))
scheme@(guile-user) [3]> (cube 27)
$5 = 3.0000000000000977
scheme@(guile-user) [3]> (cube 56)
$6 = 3.8258623655463055
scheme@(guile-user) [3]> (cube 100)
$7 = 4.64158883361313
気づいたこと
- 手続き抽象かぁ。なんかどのプログラミング言語でもあるような気がする。(変数抽象は少なくともあったはず。ただ、手続きを抽象化するのはあんまりないか?)
- レキシカルスコープってそう言う意味なんだ!素人解釈ですが、一連の手続きを内包して書くことで、同じ束縛変数が使用できるということでしょうか。有識者の方教えてください。。。。m(__)m
- n!の計算方法がふた通りのプロセスがあるのは当然ですよねー。。。それが?だったので、答えは次の日に回します。