; 递归方式实现
(define (f n)
(if (< n 3)
n
(+ (f (- n 1)) (* 2 (f (- n 2)))
(* 3 (f (- n 3))))))
; 迭代实现
; 自下而上
; 初始条件: f(0) = 0, f(1) = 1, f(2) = 2
; a = f(n-4), b = f(n-3), c = f(n-2)
; f(n-1) = 3f(n-4) + 2f(n-3) + f(n-2) = 3a + 2b + c
; f(n) = 3f(n-3) + 2f(n-2) + f(n-1) = 3b + 2a + (3a + 2b + c)
; 仔细观察参数的变化: a -> b, b -> c, c -> (3a + 2b + c), counter = counter -1
; 中止条件: counter = 0, f(n) = a
; 我们求得 f(n) 的值的同时, 也求得了 f(n+1), f(n+2) 的值, 多计算了 2 次.
(define (f n)
(define (f-iter a b c counter)
(if (= counter 0)
a
(f-iter b c (+ (* 3 a) (* 2 b) c) (- counter 1))))
(f-iter 0 1 2 n))
; (display (f 4))
; 自上而下
; 初始条件: f(0) = 0, f(1) = 1, f(2) = 2
; a = f(n-2), b = f(n-3), c = f(n-4)
; f(n-1) = 3f(n-4) + 2f(n-3) + f(n-2) = 3c + 2b + a
; f(n) = 3f(n-3) + 2f(n-2) + f(n-1) = 3b + 2a + (3c + 2b + a)
; 仔细观察参数的变化: a -> (3c + 2b + a), b -> a, c -> b, counter = counter -1
; 中止条件: counter < 3, f(n) = a
; 不会产生多余运算.
(define (f n)
(define (f-iter a b c counter)
(if (< counter 3)
a
(f-iter (+ (* 3 c) (* 2 b) a) a b (- counter 1))))
(if (< n 3)
n
(f-iter 2 1 0 n)))
(display (f 4))