SICP

SICP問題4.1

3章が終了して4章開始。元のlist-of-values (define (list-of-values exps env) (if (no-operands? exps) '() (cons (eval (first-operand exps) env) (list-of-values (rest-operands exps) env)))) 基盤のLispの評価の順と無関係に被演算子を左から右へ評…

SICP問題3.82

monte-carlo積分のストリーム版。 問題3.5からコピペして修正。 (use srfi-27) (define (random x) ; (random-integer x)) (* (random-real) x)) (define (random-in-range low high) (let ((range (- high low))) (+ low (random range)))) 範囲内でランダ…

SICP問題3.81

乱数をresetする数値と、前の乱数の値からgenerateするための要求(今回はgenerateという文字列)からなるストリームを入力ストリームとして乱数のストリームを生成する手続き。 前の乱数の値から乱数を発生させるrand-updateはテスト用ですごく適当です。 (de…

SICP問題3.80

直列RLC回路(series RLC circuit)の振る舞いをモデル化する一対のストリームを生成する手続き。これも全然分からないんだけど、図のままに実装。 (define (RLC R C L dt) (define (rlc vc0 il0) (define vc (integral (delay dvc) vc0 dt)) (define il (inte…

SICP問題3.79

問題3.78のsolve-2ndを一般化し、一般的な二階微分方程式を解くのに使えるようにする元のsolve-2nd()を解く手続き (define (solve-2nd a b dt y0 dy0) (define y (integral (delay dy) y0 dt)) (define dy (integral (delay ddy) dy0 dt)) (define ddy (add-…

SICP問題3.78

同次二階線形微分方程式 良く分からないけど、とりあえず図のとおりに手続きを定義する (define (solve-2nd a b dt y0 dy0) (define y (integral (delay dy) y0 dt)) (define dy (integral (delay ddy) dy0 dt)) (define ddy (add-streams (scale-stream dy …

SICP問題3.77

元のintegral(教科書で定義) (define int (cons-stream initial-value (add-streams (scale-stream integrand dt) int))) 出力ストリームの第一要素より先を生成するよう要求された時だけ、被積分値を評価すべくforceするように再定義したintegral(教科書で…

SICP問題3.76

各要素が入力ストリームの二つの連続する要素の平均であるストリームを生じる手続きsmoothの定義 (define (smooth input-stream) (define (iter s) (cons-stream (/ (+ (stream-car s) (stream-car (stream-cdr s))) 2) (iter (stream-cdr s)))) (cons-strea…

SICP問題3.75

Louis Reasonerが定義したバグの入った平滑化make-zero-crossings(教科書で定義) (define (make-zero-crossings input-stream last-value) (let ((avpt (/ (+ (stream-car input-stream) last-value) 2))) (cons-straem (sign-change-detector avpt last-val…

SICP問題3.74

符号の変化を検出器する手続き (define (sign-change-detector after before) (cond ((and (< before 0) (>= after 0)) 1) ((and (>= before 0) (< after 0)) -1) (else 0))) いんちきsense-dataの定義 (define test-list (list 1 2 1.5 1 0.5 -0.1 -2 -3 -2…

SICP問題3.73

積分器の実装(教科書で定義) (define (integral integrand initial-value dt) (define int (cons-stream initial-value (add-streams (scale-stream integrand dt) int))) int) RC回路の実装。さっぱり分からないけど、 式のとおりに実装。 (define (RC R C …

SICP問題3.72

三通りの異なる方法で二つの平方数の和としてかける全ての数のストリームを生成する手続き(問題3.71と似た方法で実装) (define (square-weight x) (let ((i (car x)) (j (cadr x))) (+ (square i) (square j)))) (define square-weighted-stream (weighted-p…

SICP問題3.71

立方数の和で重み付けするための手続き (define (cube-weight x) (let ((i (car x)) (j (cadr x))) (+ (cube i) (cube j)))) 立方数の和で重み付けした順序のストリーム (define cube-weighted-stream (weighted-pairs integers integers cube-weight)) 二通…

SICP問題3.70

merge手続きに似たmerge-weighted手続き (define (merge-weighted s1 s2 weight) (cond ((stream-null? s1) s2) ((stream-null? s2) s1) (else (let ((s1car (stream-car s1)) (s2car (stream-car s2))) (let ((s1weight (weight s1car)) (s2weight (weight …

SICP問題3.69

pairsの定義(教科書で定義) (define (pairs s t) (cons-stream (list (stream-car s) (stream-car t)) (interleave (stream-map (lambda (x) (list (stream-car s) x)) (stream-cdr t)) (pairs (stream-cdr s) (stream-cdr t))))) 三つの無限ストリームS,Tお…

SICP問題3.68

Louis Reasonerが定義したpair手続き (define (pairs s t) (interleave (stream-map (lambda (x) (list (stream-car s) x)) t) (pairs (stream-cdr s) (stream-cdr t)))) この定義は動くか?Louis の piars 手続きを使って(pairs integers integers)を評価す…

SICP問題3.67

pairs手続きを修正して(pairs i j)が(i 元のpairs手続き (define (pairs s t) (cons-stream (list (stream-car s) (stream-car t)) (interleave (stream-map (lambda (x) (list (stream-car s) x)) (stream-cdr t)) (pairs (stream-cdr s) (stream-cdr t))))…

SICP問題3.66

append のストリーム版(教科書で定義) (define (stream-append s1 s2) (if (stream-null? s1) s2 (cons-stream (stream-car s1) (stream-append (stream-cdr s1) s2)))) 第二のストリームを取り込む前に第一のストリームから全ての要素を取るので無限ストリ…

SICP問題3.65

級数 を使い、πで実行したのと同様に2の自然対数の近時の三つの並びを計算して、これらの並びはどのくらい早く収束するのかを見る。 良く分からないので教科書の言うとおりに定義。 (define (ln-summands n) (cons-stream (/ 1.0 n) (stream-map - (ln-summa…

SICP問題3.64

引数としてストリームと数値(許容誤差)を取る手続きstream-limitを定義せよ。 stream-lmitはストリームを調べて会い続く二つの要素が絶対値で許容誤差より小さくなるのを見つけ、その二つの要素の二番目を返す。 いい加減stream-refを入力するのに飽きたので…

SICP問題3.63

元のsqrt-stream (define (sqrt-stream x) (define guesses (cons-stream 1.0 (stream-map (lambda (guess) (sqrt-improve guess x)) guesses))) guesses) Louis Reasonerによる局所変数guessesを使用しないsqrt-stream (define (sqrt-stream x) (cons-strea…

SICP問題3.62

二つのべき級数を割る手続きdiv-seriesを定義せよ。 分母が零の定数項を持つならdiv-seriesはエラーを出すこと。 div-seriesを3.59の結果とともに使い、正接のべき級数を生成する方法を述べよ。 という問題でdiv-seriesは (define (div-series s1 s2) (mul-s…

SICP問題3.61

定数項が1のべき級数Sに対してとなるXを求めるinvert-unit-seriesを定義する 考え方は以下のとおり ということで、相変わらず分からないが、言われるままに定義 (define (invert-unit-series s) (let ((sr (stream-cdr s))) (cons-stream 1 (stream-map - (m…

SICP問題3.60

べき級数の積についてはWikipediaを見ると 積fgとは とおくとき、係数を畳み込み で定めることによって得られる冪級数のことを言う。 冪級数 - Wikipedia とのことですが、あまり理解できないです。 ということでググって写経状態ですが、以下のコードを。 …

SICP問題3.59

2010/02/24 cosine-seriesのコードを間違えていたので修正 a. 級数の積分はcを任意の定数として である をとり、級数の積分の定数項を除いた項の係数のストリームを返す手続きintegrate-seriesを定義する (define (integrated-series s) (stream-map / s int…

SICP問題3.58

expand 手続き(教科書で定義) ※quotientは二つの整数の整数の商を返す基本手続き (define (expand num den radix) (cons-stream (quotient (* num radix) den) (expand (remainder (* num radix) den) den radix))) expand 手続きが生じる要素は (expand 1 7…

SICP問題3.57

add-sstreams 手続き fibs の定義を使い, n番目の Fibonacci 数を計算する時、加算は何回実行されるか? memo-proc が用意する最適化を行わずに(delay )を単に(lambda () )と実装したとすると、加算の回数が指数的に大きくなることを示せという問題。add-stre…

SICP問題3.56

R.Hammingが提起した2, 3, 5以外の素数の因子を持たない整数の数え上げ Sは1から始まる (scale-stream S 2)の要素はSの要素である (scale-stream S 3) と (scale-stream S 5)についても同様である これらは全てSの要素である 上記を満たすSの定義を穴埋めで…

SICP問題3.55

引数としてストリームSをとり、その要素がS0, S0+S1, S0+S1+S2, ... であるようなストリームを返す手続きpartial-sumsの定義。 (define (partial-sums s) (cons-stream (stream-car s) (add-streams (stream-cdr s) (partial-sums s)))) テスト (stream-ref …

SICP問題3.54

mul-streamsの定義 (define (mul-streams s1 s2) (stream-map * s1 s2)) 0から数えてn番目の要素がn+1の階乗となる定義 (define factorials (cons-stream 1 (mul-streams factorials (add-streams ones integers)))) テスト (stream-ref factorials 0) ; 1 (…