SICP

問題1.39

昨日の続きで一気にやっちゃえば良かった。 (define (tan-cf x k) (define (square x) (* x x)) (define (d i) (- (* 2 i) 1)) (define (n i) (if (= i 1) x (- (square x)))) (cont-fact n d k))

問題1.38

ネイピア数を求める問題。 Diの漸化式が違うだけ。 (define (d i) (if (= (remainder i 3) 2) (/ (* (+ i 1) 2) 3) 1)) この問題を解いてるときに、前の問題の答えが全く間違っていたことが判明。 黄金比はNi, Diが常に1と非常に特殊なケースなので、バグが…

問題1.37

反復版 (define (cont-fact n d k) (define (iter kai n d count) (cond ((= count 0) kai) (else (iter (/ (n count) (+ (d count) kai)) n d (- count 1))))) (iter 0 n d k)) (最初に書いたコードは間違ってました。黄金比の場合、Diが常に1なので、気づ…

問題1.36

○○シミュレータでよく使う手です。でも、英語で"damping"と言うのに対して、日本語で『緩和法』と言うのは、少し違和感がある気がする。ていうか、緩和と言う言葉を乱用しすぎてるのかもしれんが。とりあえず、2.0を初期値にした場合 Normal版: 34回で収束 …

問題1.35

最近、数値解析をやっているので、このような更新式じみた式を見ると萌えるw (fixed-point (lambda (x) (+ 1 (/ 1 x))) 1.0) => 1.6180327868852458

SICP-Lite #3

気づくと、まだ3回目。もっと、何回もやっている記憶がするなぁ。 環境フレーム 今日は、環境と環境フレームの話からスタート。 SICPの本には、環境の説明がされているのですが、Gaucheの本には同じことを環境フレームと言う概念で説明してます。 Gaucheの本…

問題1.34

何か寝不足気味だけど、少しでも進めておこう。λ萌え〜な問題かと思いきや、 (define (f g) (g 2)) (f f) => (f 2) => (2 2) => Error: 2が関数じゃないから。 って、lambda関係ないやん>

問題1.33

ここまでくると、コードから意味を読み取るのは大変。馴れが重要なのかな? filtered-accumulate (define (filtered-accumulate filter combiner null-value term a next b) (if (> a b) null-value (if (filter a) (combiner (term a) (filtered-accumulate…

問題1.32

この辺から、抽象化しすぎで段々雲行きが怪しくなる。 実際にこのようなコードを書いたとしたら、ちゃんとメンテできるだろうか? accumulate再帰的手続き (define (accumulate combiner null-value term a next b) (if (> a b) null-value (combiner (term …

問題1.31

今日は比較的順調。 product手続き (define (product term a next b) (if (> a b) 1 (* (term a) (product term (next a) next b)))) productを使ったfactorial (define (factorial n) (define (term x) x) (define (next n) (+ n 1)) (product term 1 next …

問題1.30

sum手続きを反復プロセスに書き直す問題。 (define (sum-iter term a next b) (define (iter a result) (if (> a b) result (iter (next a) (+ result (term a))))) (iter a 0)) これは、意外とすんなり書けた。多分、sumと言う手続きが数え上げる意味合いの…

問題1.29

シンプソンの公式の問題。 意外とむずかった。というか、やっているうちに、高階関数のことをさっぱり忘れてしまって、『何やってんだっけ?』と言う状態に陥ってしまった。 (define (simpson f a b n) (define h (/ (- b a) n)) (define (y k) (f (+ a (* k…

高階手続き

だいぶん、問題をすっ飛ばして、ここまでやってきた。 さて、高階関数。日本語にすると、普通っぽいけど、英語だとやたらめったらかっこ良い。"Higher-Order Function"そんなかっこい高階関数ですが、普段プログラミングしているとほとんど現れない。という…

問題1.23(Profile)

と言うことで、まんま同じように取ってみた。 http://d.hatena.ne.jp/tkuro/20090828/1251471257 オリジナル gosh> (begin (profiler-reset) (profiler-start) (prime? 100000000003) (profiler-stop) (profiler-show)) Profiler statistics (total 45 sampl…

問題1.27, 1.28

飛ばします。 何かこの辺は、問題見るのも疲れる。多分、一番最初に一人でやったとすると、ここで本を破いてるかもwww

問題1.26

感覚的には、 expmodを2重に評価している。 expmodは木構造再帰 なので、O(n)になっちゃうよ、ってことかな。実験省略。

問題1.25

わからない。

問題1.24

飛ばします。

問題1.23

変更点 (define (next-tester n) (if (= n 2) 3 (+ n 2))) (define (find-divisor n test-divisor) (cond ((> (square test-divisor) n) n) ((divides? test-divisor n) test-divisor) (else (find-divisor n (next-tester test-divisor))))) テスト。 1,000…

問題1.22

runtimeは、Gaucheにはないらしいので、『素人くさい〜』から頂いてきました*1。 http://www.csus4.net/hiki/SICPReading/?naoya_t+%28naochan%29#l56 (define (runtime) (- (time->seconds (current-time)) 1136041200)) ぼくの環境では、 1,000~ 1009 *** …

問題1.21

やるだけなので、省略。

1.2.6 素数性のテスト

毎日少しずつと思ってるものの、今回は特にやる気が。。。 かなりの部分が数学だもんね〜。 とりあえず、できそうなやつのみ、やってみます。

問題1.20

最大公約数の問題をNormal-Orderで展開したときと、Applicative-Orderで展開したときでトレースしろってことかな? てことで、真面目にやってみた(かなりはしょったけど)。まず、Normal-Order (gcd 206 40) ;=> (gcd 40 (rem 206 40))) ;=> (gcd (rem 206 40…

1.2.5 最大公約数

一日一節ぐらい行きたいところだけど、仕事が入るとペースがすこぶる鈍る。早く4章まで行きたい。さて、Euclidのアルゴリズム。一番最初に習ったのがいつかは忘れたけど、便利なアルゴリズム。 でも、このアルゴリズムの一番の妙なところと言うのは、完全再…

四方山話

第4章付近で我を見失ったSICPに再度挑戦すべく、SICP-Liteの力を借りつつ、やってるわけですが、少し脱線。id:Ehrenの勧めでプログラミングの基礎 (Computer Science Library)作者: 浅井健一出版社/メーカー: サイエンス社発売日: 2007/03メディア: 単行本購…

問題1.19

息切れ。。。飛ばす。

問題1.18

結論から行くと、問題1.16と同じような方法で解ける。なぜ、その方法が思いつくかと言うと、わからない(天才の脳を見てみたい)。と言うことで、凡人の私は、問題1.16と同じ方法で、状態変数nを使って、ある量が一定になるようにしたら、答えが出てきました。…

問題1.17

これは、再帰的なかけ算の問題。再帰プロセスで考えていいそうなので楽*1。アルゴリズム 奇数のとき: a * b = (2a) * (b/2) 偶数のとき: a * b = a + a * (b-1) コード (define (fast-mul a b) (define (double n) (* n 2)) (define (halve n) (/ n 2)) (def…

問題1.16

ベキ乗の計算でO(logn)で解く方法を再帰プロセスではなく、反復プロセスで解く方法。 反復プロセスにするのって、すごい難しい。この問題も全然思いつかず、つい答えを見てしまった。ヒントにある通り、状態変数aを用意しておいて、a=b^0にセット。それで、…

レキシカルスコープとダイナミックスコープ

レキシカルスコープ: 関数が定義された時点でコードの文脈から決まるスコープ ダイナミックスコープ: 実行時の状態で呼び出し順序から決まるスコープ てな理解でいいかな。何か、しっくり来ないので、もう少しちゃんと挙動を把握したい。クロージャがどう動…