SICP解答メモ&解説 (問題1.29〜問題1.33)
問題1.29
全然わからんのでパス
問題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))
問題1.31
再帰プロセス版
(define (product a b term next) (if (> a b) 1 (* (term a) (product (next a) b term next))))
反復プロセス版
(define (prodecut a b term next) (define (iter a result) (if (> a b) result (iter (next a) (* result (term a))))) (iter a 1))
階乗計算関数factorial
(define (identify x) x) (define (inc x) (+ x 1)) (define (factorial n) (product 1 n identify inc))
πの計算はパス
問題1.32
再帰プロセス版
; recursive (define (accumulate combiner null-vallue term a next b) (if (> a b) null-vallue (combiner (term a) (accumulate combiner null-vallue term (next a) next b))))
反復プロセス版
; iterative (define (accumulate combiner null-vallue term a next b) (define (iter a result) (if (> a b) result (iter (next a) (combiner result (term a))))) (iter a null-vallue))
解答集の反復版の方がきれいだなあ。
accumulateを使ってのsum
(define (sum term a next b) (accumulate + 0 term a next b))
同じくproduct
(define (product term a next b) (accumulate * 1 term a next b))
問題1.33
再帰プロセス版
; recursive (define (filtered-accumulate combiner null-vallue term filter a next b) (cond ((> a b) null-vallue) ((filter a) (combiner a (filtered-accumulate combiner null-vallue term filter (next a) next b))) (else (filtered-accumulate combiner null-vallue term filter (next a) next b))))
反復プロセス版
; iterative (define (filtered-accumulate combiner null-vallue term filter a next b) (define (iter a result) (cond ((> a b) result) ((filter a) (iter (next a) (combiner result (term a)))) (else (iter (next a) result)))) (iter a null-vallue))
範囲a〜bの素数の二乗の和を計算する手続きsum-square-prime
; square , inc 手続きは既に定義されているとする。 (define (sum-square-prime a b) (filtered-accumulate + 0 square prime? a inc b)