問題1.11

再帰関数を、再帰的プロセス、反復的プロセスで記述せよ

; 答え合わせ用にトレース

; (f 3)
; ==> (+ (f 2) (* 2 (f 1)) (* 3 (f 0)))
; ==> (+ 2 (* 2 1) (* 3 0))
; ==> (+ 2 2 0)
; ==> 4

; (f 4)
; ==> (+ (f 3) (* 2 (f 2)) (* 3 (f 1)))
; ==> (+ 4 4 3)
; ==> 11

; 再帰的プロセス
(define (f n)
  (if (< n 3)
      n
      (+ (f (- n 1)) (* 2 (f (- n 2))) (* 3 (f (- n 3))))))

; 反復的プロセス
(define (f n)
  (define (f-iter a b c count)
    (if (= count 2)
	a
	(f-iter (+ a (* 2 b) (* 3 c)) a b (- count 1))))
  (if (< n 3)
      n
      (f-iter 2 1 0 n)))

AnswerBookは、n<3の場合も反復関数の中で解決している。
ここは好みかな。