SICP

問題 1.34

結構、間が空いてしまったけど…

問題1.32

僕の解答 こんな感じ。 (define (accumulate combiner null-value term a next b) (if (> a b) null-value (combiner (term a) (accumulate combiner null-value term (next a) next b)))) (define (sum term a next b) (accumulate + 0 term a next b)) (de…

問題1.33

僕の解答 フィルタの説明が少ないよ…。 filtered-accumulateがこんな感じかな? ;(define (filtered-accumulate combiner null-value term a next b filter) ; (define (filtering a) ; (if (filter a) (term a) null-value)) ; (if (> a b) ; null-value ; …

問題1.29

僕の解答 こんな感じかな? (define (cube x) (* x x x)) (define (sum term a next b) (if (> a b) 0 (+ (term a) (sum term (next a) next b)))) (define (indegral f a b dx) (define (add-dx x) (+ x dx)) (* (sum f (+ a (/ dx 2)) add-dx b) dx)) (def…

問題1.30

僕の解答 こんな感じかな? (define (sum term a next b) (define (iter a result) (if (> a b) result (iter (next a) (+ result (term a))))) (iter a 0)) 解答例 http://oss.timedia.co.jp/show/SICP/ex-1.30 http://www.csus4.net/hiki/SICPReading/?1.30

問題1.31

僕の解答 (define (product term a next b) (if (> a b) 1 (* (term a) (product term (next a) next b)))) ;(define (product term a next b) ; (define (iter a result) ; (if (> a b) ; result ; (iter (next a) (* result (term a))))) ; (iter a 1)) (d…

問題1.28

僕の解答 とりあえず、途中まで考えたとこでギブ… (define (square n) (* n n)) (define (expmod base exp m) (cond ((= exp 0) 1) ((even? exp) (let* ((x (expmod base (/ exp 2) m)) (y (square x))) (if (and (not (= y 1)) (not (= y (- m 1))) (= (rem…

問題1.26

僕の解答 expmodを2回評価してるから、遅くなった…という話かな? 解答例 http://oss.timedia.co.jp/show/SICP/ex-1.26 http://www.csus4.net/hiki/SICPReading/?naoya_t+%28naochan%29#l49

問題1.27

僕の解答 こんな感じかな? (define (square n) (* n n)) (define (expmod base exp m) (cond ((= exp 0) 1) ((even? exp) (remainder (square (expmod base (/ exp 2) m)) m)) (else (remainder (* base (expmod base (- exp 1) m)) m)))) (define (try-exp…

問題1.21

メシ食ったあと、問題を解くのは辛い…

問題1.22

とりあえずがんばってみたけど…

問題1.23

僕の解答 とりあえず、nextを定義して速度を比べてみる。 (define (next n) (if (= n 2) 3 (+ n 2))) 改良前 1009 *** 0.0 1013 *** 0.0 1019 *** 0.0 10007 *** 0.0 10009 *** 0.0 10037 *** 0.0 100003 *** 0.0 100019 *** 0.0 100043 *** 0.0 1000003 ***…

問題1.24

僕の解答 とりあえず実装。 試行回数は10回としてみる。 (use srfi-27) (define random random-integer) (define (runtime) (- (time->seconds (current-time)) 1136041200)) (define (square n) (* n n)) (define (expmod base exp m) (cond ((= exp 0) 1) …

問題1.25

僕の解答 結局のところ、remainderは内部で引き算を繰り返しているんじゃなかろうか? なので、乗算・除算を交互にやれば、(桁数が増えないので)remainderの計算量を減らせる…とか。 解答例 http://oss.timedia.co.jp/show/SICP/ex-1.25 http://www.csus4.ne…

問題1.20

僕の解答 正規順序でも、作用的順序でもremainder演算の回数は変わらず、かな。 ; 正規順序 (gcd 206 40) (gcd 40 (remainder 206 40)) ; ↓1回目(ifで評価) (gcd 6 (remainder 40 6)) ; ↓2回目(ifで評価) (gcd 4 (remainder 6 4)) ; ↓3回目(ifで評価) (gc…

問題1.16

僕の解答 (define (even? n) (= (remainder n 2) 0)) (define (expt b n) (expt-iter b n 1)) (define (expt-iter b counter product) (cond ((= counter 0) product) ((even? counter) (expt-iter b (- counter 2) (* b b product))) (else (expt-iter b (-…

問題1.17

僕の解答 (define (even? n) (= (remainder n 2) 0)) (define (double n) (* n 2)) (define (halve n) (/ n 2)) (define (times a b) (cond ((= b 0) 0) ((even? b) (times (double a) (halve b))) (else (+ a (times a (- b 1)))))) こんな感じかな? 解答…

問題1.18

僕の解答 (define (even? n) (= (remainder n 2) 0)) (define (double n) (* n 2)) (define (halve n) (/ n 2)) (define (times a b) (times-iter a b 1)) (define (times-iter a b product) (cond ((= b 0) 0) ((even? b) (times-iter (double a) (halve b)…

問題1.19

僕の解答 ギブ…orz 解答例 http://www.csus4.net/hiki/SICPReading/?Fujitani 所感 うー、ぜんぜんダメダメ。 とにかく2回使ってみればよかったかなぁ…

問題1.14

僕の解答 (coin-change 12)と(coin-change 9)の場合を考えると、爆発的にスペースと計算量が増えるわけではないので、増加の程度はO(n)かなぁ… 解答例 http://oss.timedia.co.jp/show/SICP/ex-1.14 http://www.csus4.net/hiki/SICPReading/?naoya_t+%28naoch…

問題1.15

僕の解答 プログラムを修正してみる。 (define (cube x) (* x x x)) (define (p x) (display (list "p" x)) (newline) (- (* 3 x) (* 4 (cube x)))) (define (sine angle) (display (list "sine" angle)) (newline) (if (not (> (abs angle) 0.1)) angle (p …

問題1.11

しばし悩む…

問題1.12

また悩む…

問題1.13

僕の解答 fib(k+2)をfib(k+1)+fib(k)の形に持っていけるかなーと、ぐねぐねこねくり回してみるものの、うまくできず…orz 解答例 http://oss.timedia.co.jp/show/SICP/ex-1.13 http://www.csus4.net/hiki/SICPReading/?naoya_t+%28naochan%29#l77 所感 「*1 /…

問題1.9

僕の解答 上のほうは (+ 4 5) (inc (+ 3 5)) (inc (inc (+ 2 5))) (inc (inc (inc (+ 1 5)))) (inc (inc (inc (inc (+ 0 5))))) (inc (inc (inc (inc 5)))) (inc (inc (inc 6))) (inc (inc 7)) (inc 8) 9 に展開されるから、再帰的プロセス。 下のほうは (+ …

問題1.10

僕の解答 わっかんねー! とりあえず、実行してみると (A 1 10) ;=> 1024 (A 2 4) ;=> 65536 (A 3 3) ;=> 65536 でも、これだけじゃさっぱり分からん。まず (define (f n) (A 0 n)) を展開すると、 (* 2 n) ;ただし、n=0のときは0、n=1のときは2 ;って、条件…

問題1.6

僕の解答 new-ifを呼び出したときに、引数が全部評価されるので、無限ループ 解答例 http://www.csus4.net/hiki/SICPReading/?naoya_t+%28naochan%29#l86 http://oss.timedia.co.jp/show/SICP/ex-1.6 所感 はじめ、さっぱりわかんなかった。なんでだろう…と。…

問題1.7

僕の解答 あんまり大きい/小さい数だと、2乗したときに精度外の値になるから…かな? あたらしいsqrtはこんな感じ。 (define (average x y) (/ (+ x y) 2)) (define (improve guess x) (average guess (/ x guess))) (define (good-enough? pre-guess guess) (…

問題1.8

僕の解答 こんな感じかな… (define (improve guess x) (/ (+ (/ x (* guess guess)) (* 2 guess)) 3)) (define (good-enough? x guess) (< (abs (- (* guess guess guess) x)) 0.001)) (define (cubic-iter guess x) (if (good-enough? x guess) guess (cubi…

問題1.5

僕の解答 作用的順序の場合、testを評価する前に引数を評価しようとするので、pで無限ループ(実際そうなった) 正規順序(遅延評価)のばあい、pを評価する前にtest→ifが評価されて、0が返る。 でよいのかな? 解答例 http://oss.timedia.co.jp/show/SICP/ex-1.…