どうにも、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))