00. First


数列で学ぶ初めての CommonLisp
      # fibonacci

       2012-04-28
01. Profile


  Akiko Terada (@pgf2)

Work : software developer
02. fibonacci


F(0) = 0
F(1) = 1
F(n) = F(n-2)+F(n-1) (n >= 2)

F(-n) = (-1)^{n+1}*F(n)
03. Recursion

再帰(さいき)とは、あるものについて記述する
際に、記述しているものそれ自身への参照が、そ
の記述中にあらわれることをいう。定義におい
て、再帰があらわれているものを再帰的定義とい
う。

                      再帰 - Wikipedia
03. Recursion


(defun fib(n)
 (cond ((< n 1) 0)
        ((= n 1) 1)
        (t (+ (f (- n 2)) (f (- n 1))))))
04. Dynamic Programming


動的計画法は、コンピュータ科学の分野におい
て、ある最適化問題を複数の部分問題に分割して
解く際に、そこまでに求められている以上の最適
解が求められないような部分問題を切り捨てなが
ら解いていく手法である。

                  動的計画法 - Wikipedia
04. Dynamic Programming

(defun fib(n)
 (let ((n0 0) (n1 1) (i 1) (tmp))
   (loop
     (if (> i n) (return n0))
     (setq tmp (+ n0 n1))
     (setq n0 n1)
     (setq n1 tmp)
     (incf i))))
05. Memoization


メモ化とは、プログラムの高速化のための最適化
技法の一種であり、サブルーチン呼び出しの結果
を後で再利用するために保持し、そのサブルーチ
ン(関数)の呼び出し毎の再計算を防ぐ手法であ
る。

                    メモ化 - Wikipedia
05. Memoization
(setf (symbol-function 'fib)
    (let ((table (make-hash-table :test #'equal)))
      (labels ((f (n)
               (let ((val (gethash n table nil)))
                 (unless val
                   (setf val
                       (cond ((< n 0) 0)
                              ((= n 1) 1)
                              (t (+ (f (- n 2)) (f (- n 1))))))
                   (setf (gethash n table) val))
                  val)))
        #'f)))
07. Last



ご清聴ありがとうございました!

pre: 数列で学ぶ初めての CommonLisp #fibonacci