SICP問題1.11

n < 3 の時 f(n) =n
n >= 3 の時 f(n) = f(n - 1) + 2f(n - 2) + 3f(n - 3)

まず再帰的プロセスでfを計算する手続き。

(define (recursive-f n)
  (cond ((< n 3) n)
        (else (+ (recursive-f (- n 1)) 
                 (* 2 (recursive-f (- n 2)))
                 (* 3 (recursive-f (- n 3))))))
)

次に反復的プロセスでfを計算する手続き。

(define (iterative-f n)
  (define (f n1 n2 n3)
    (+ n1 (* 2 n2) (* 3 n3))
  )
  (define (iter-f n1 n2 n3 counter max-count)
    (if (> counter max-count)
        (f n1 n2 n3)
        (iter-f (f n1 n2 n3) n1 n2 (+ counter 1) max-count))
  )
  (cond ((< n 3) n)
        (else (iter-f 2 1 0 1 (- n 3))))
)

他の方のを見ると、カウンターを減らしていって、数値を判定すればパラメータとして最大値はいらないということで、もっとすっきりしてますね。

(define (g n)
  (define (iter a b c count)
    (if (= count 2)
        a
        (iter (+ a (* 2 b) (* 3 c)) a b (- count 1))))
  (if (< n 3) 
      n 
      (iter 2 1 0 n)))
http://sicp.naochan.com/memo.pl?p=%CC%E4%C2%EA1.11