本投稿の目的
Structure and Interpretation of Computer Programsを読み始めて5日目。
毎日ログをつけなければサボると思い、日記程度にまとめます。DS勉強してました。Pythonしか書けないです。(書けるといっても、Vibe Coding勢。)(著者はあまりどっぷり何かに浸かったことがない人間。)
〜P48の半分まで終わった。(1Pしか進んでいない。。。悔しいが進歩したということにしましょう)
月に更新する暇がなかったので、サボってしまいました。(進捗はございます)
気づいたこと
- 対数的な回数は"半分化"を目指す
- 反復プロセスのコツは
a*b + c | a*b^nのように式を分割し、cやaのような途中結果を溜める箱を作り、bがeven/oddの場合で式が定数になるように心がける!!
練習問題1.16
これは、状態変数があまりうまく理解できていない自分には考え方が難しかったです・・・
なのでチャッピにヒントをいただきましたが、
(a,b,n)
↓ 偶数
(?, ?, ?)
(a,b,n)
↓ 奇数
(?, ?, ?)
こんな高級ヒントをいただいてしまって、普通に解けちゃいました。。もっと難しいヒントを出して欲しいものです。。
ここでチャッピも一言"ラッパー的にかくと〜〜〜"なんか包んでそうだなと思ったら、変数aが余計かなという言及。確かに!なので、入力はb&nのみでサクッと書き換えてみた(以下)
; wrapper
(define (e b n)
(define (iter a b n)
(cond ((= n 0) a)
((even? n) (iter a (square b) (/ n 2)))
(else (iter (* a b) b (- n 1)))))
(iter 1 b n))
ワッパーの出来上がりです。(🍔)
練習問題1.17
fast-iterを参考にしながら作れば、パズルみたいに解けました!なんか少しずつオーダーに関する肌感がわかってきたような?
→メモ:対数的な回数は"半分化"を目指す
(define (fast-multi a b)
(cond ((= b 0) 0)
((even? b) (double (fast-multi a (halve b))))
(else (+ a (fast-multi a (- b 1))))
))
練習問題1.17
ラッパー面白いぞ!これも少しのヒントで解けた!!
→メモ:反復プロセスのコツはa*b + c | a*b^nのように式を分割し、cやaのような途中結果を溜める箱を作り、bがeven/oddの場合で式が定数になるように心がける!!
(define (kakeru a b)
(define (multi a b c)
(cond ((= b 0) c)
((even? b) (multi (double a) (halve b) c))
(else (multi a (- b 1) (+ c a)))
))
(multi a b 0))
(kakeru 9 5)