1.2.2 木構造再帰 - 計算機プログラムの構造と解釈 第二版
n<3に対してf(n)=n,
n ≥ 3に対してf(n)=f(n - 1) + 2 f(n - 2) + 3 f(n - 3)
なる規則で定義する関数fがある.
再帰的プロセスの方法でf を計算する手続きを書け.
反復的プロセスの方法でfを計算する手続きを書け.
まずは素直に思ったまま書く。
(define (f n)
(cond ((< n 3) n)
(else
(+ (f (- n 1))
(* 2 (f (- n 2)))
(* 3 (f (- n 3)))))))
思ったまま書くとやはり再帰的プロセスになる。再帰的プロセスのほうが直感的だからね。
次に反復的プロセスに書き直す。 ポイントとしては、同じ計算になるところを引数で渡して使い回せば良いと思われる。
(define (f n)
(define (f-iter a b c count)
(if (< count 3) a
(f-iter (+ a (* 2 b) (* 3 c)) a b (- count 1))))
(cond ((< n 3) n)
(else
(f-iter 2 1 0 n))))
f-iterは、今回・1つ前・2つ前の値を引数で受け取る。