問題1.33 – SICP(計算機プログラムの構造と解釈)その16
問題1.33 まず再帰的プロセスのものを書く。 (define (filtered-accumulate combiner null-value filter-pre term a next b) (cond ((> a b) null-value) ((filter-pre a) (combiner (term a) (filtered-accumulate combiner null-v…続きを読む
問題1.33 まず再帰的プロセスのものを書く。 (define (filtered-accumulate combiner null-value filter-pre term a next b) (cond ((> a b) null-value) ((filter-pre a) (combiner (term a) (filtered-accumulate combiner null-v…続きを読む
問題1.32 a 再帰的プロセスの accumulate (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)))) ;; sum (define…続きを読む
問題1.31 a sum 手続きとほぼ同じ形で表せる(+ が * になる)。 ただし、a > b の際の戻り値が1となる。 (define (product term a next b) (if (> a b) 1 (* (term a) (product term (next a) next b)))) product を使って factorial を書く。 (define (fac…続きを読む
問題1.30 線形再帰の sum 手続き (define (sum1 term a next b) (if (> a b) 0 (+ (term a) (sum1 term (next a) next b)))) a から b までの整数の和(線形再帰手続き) (define (sum-integers1 a b) (define (identify x) x) (define (inc x…続きを読む
問題1.27 パス 問題1.28 パス 問題1.29 うーん、Simpsonの公式を使った方が精度が落ちているような気がする… (define (cube x) (* x x x)) (define (inc x) (+ x 1)) (define (sum term a next b) (if (> a b) 0 (+ (term a) (sum term (next a) n…続きを読む
問題1.24 計算量は Θ(log n) の増加なので 1,000:1,000,000 は 1:2 程度と予想される。 結果を見ると 1:4 ぐらいになっている。 (define (square n) (* n n)) (define (smallest-divisor n) (find-divisor n 2)) (define (find-divisor n test-divisor…続きを読む
問題1.21 (define (square n) (* n n)) (define (smallest-divisor n) (find-divisor n 2)) (define (find-divisor n test-divisor) (cond ((> (square test-divisor) n) n) ((divides? test-divisor n) test-divis…続きを読む
問題1.19 p’ : (+ (* p p) (* q q)) q’ : (+ (* 2 p q) (* q q)) 問題1.20 (define (gcd a b) (if (= b 0) a (gcd b (remainder a b)))) 正規順序の置き換えの場合。赤字部分が実行される remainder。 remainder を rem と省略表記している。 18回。 (gcd 206 …続きを読む
問題1.16 不変量 ab^n について、答えを見れば「ああ、そういうことか」と解るけれども、自分の頭ではこのような計算が思い浮かばない… (define (fast-expt-iter b n) (expt-iter b n 1)) (define (expt-iter b n a) (cond ((= n 0) a) ((even? n) (expt-iter (* b b) (/…続きを読む
Scheme処理系の Gauche で #?= を使って printf debug をする。 #?=expr は (debug-print expr) と置き換えられ expr を評価して結果を返す。 結果を返す前後に、評価式とその値を print する。 使用例 再帰的プロセスの factorial gosh> (define (factorial n) (if (= n 1) 1 (* …続きを読む