どうにも、SICP 内だけで説明されている Scheme の構文だけだといろいろ辛い気がするんですが、それでもまずはこの範囲内でやりくりした方がいいんだろうか?というのがそこはかとない疑問。
問題解答
問1.31
再帰版
(define (product term a next b) (define (iter a result) (if (> a b) result (iter (next a) (* result (term a))))) (iter a 1))
反復版
(define (product term a next b) (if (> a b) 1 (* (term a) (product term (next a) next b))))
(define (pi-next i) (+ i 2)) (define (pi-factor n) (/ (* (- n 1) (+ n 1)) (* n n))) (* (product pi-factor 3.0 pi-next 1000) 4.0)
数列の作り方が思い浮かばなかった。。。。これはプログラミング力以前の算数力の低下が。。。
問1.32
(define (accumulate combiner null-value term a next b) (define (iter a result) (if (> a b) result (iter (next a) (combiner result (term a))))) (iter a null-value)) (define (product term a next b) (accumulate * 1 term a next b)) (* (product pi-factor 3.0 pi-next 1000) 4.0)
問1.33
(define (filtered-accumulate filter combiner null-value term 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-value))
a.
(define (next i) (+ i 1) (define (square x) (* x x)) (define (prime-squaresum a b) (define (prime? n) ...) (filtered-accumulate prime? + 0 square a next b))