問題 1.11

無職の間にSICPも読んでみる。目標は焦らずしっかりと読む。問題の解答をさらす。解く順番は出来るだけシーケンシャル。

問題 1.11
n < 3 に対して f(n) = n, n ≧ 3 に対して f(n) = f(n-1) + 2f(n-2) + 3f(n-3) なる規則で定義する関数 f がある。再帰的プロセスの方法で f を計算する手続きを書け。反復的プロセスの方法で f を計算する手続きを書け。


Exercise 1.11
A function f is defined by the rule that f(n) = n if n < 3 and f(n) = f(n-1) + 2f(n-2) + 3f(n-3) if n ≧ 3. Write a procedure that computes f by means of a recursive process. Write a procedure that computes f by means of an iterative process.


再帰的プロセスは定義のまま書けばよいので簡単。

(define (f n)
  (if (< n 3)
      n
      (+      (f (- n 1))
         (* 2 (f (- n 2)))
         (* 3 (f (- n 3))))))


反復的プロセスで書くには、以前の値を保持する必要がある。今回のケースは3つの値を保持するための変数とカウンタ用の合計4つの変数を使用する。

(define (f n)
  (define (f-iter a b c counter)
    (if (< n counter)
        a
        (f-iter (+ a (* 2 b) (* 3 c)) a b
                (+ counter 1))))
  (if (< n 3)
      n
      (f-iter 2 1 0 3)))


C で書くとこういう感じになる

再帰的プロセス

int f(int n)
{
    if (n < 3)
        return n;
    else
        return f(n-1) + (2 * f(n-2)) + (3 * f(n-3));
}


反復的プロセス

int f(int n)
{
    int a, b, c, x;

    if (n < 3) {
        return n;
    } else {
        for (a = 2, b = 1, c = 0; n >= 3; n--) {
            x = a + (2 * b) + (3 * c);
            c = b;
            b = a;
            a = x;
    }
    return x;
}