(wat-aro)

無職から有職者にランクアップしました

SICP 問題1.11

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

;; 反復的プロセス
(define (g n)
  ;; iterでは3 ≦ nの時のみの処理.n1 はf(n-1),n2はf(n-2),n3はf(n-3)
  (define (iter n1 n2 n3 count)
    (if (= count 0)
        n1
        (iter (+ n1 (* 2 n2) (* 3 n3))
              n1
              n2
              (- count 1))))
  (if (< n 3)
      n
      (iter 2 1 0 (- n 2)))) ;;3≦nの時iter.n=1,2の時はn1,n2に渡してあるのでcountに渡す引数は(- n 2)