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)