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

529 views
474 views

Published on

プログラマーズナイト #3 にて LT したもの(未完成版)

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
529
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. 00. First数列で学ぶ初めての CommonLisp # fibonacci 2012-04-28
  2. 2. 01. Profile Akiko Terada (@pgf2)Work : software developer
  3. 3. 02. fibonacciF(0) = 0F(1) = 1F(n) = F(n-2)+F(n-1) (n >= 2)F(-n) = (-1)^{n+1}*F(n)
  4. 4. 03. Recursion再帰(さいき)とは、あるものについて記述する際に、記述しているものそれ自身への参照が、その記述中にあらわれることをいう。定義において、再帰があらわれているものを再帰的定義という。 再帰 - Wikipedia
  5. 5. 03. Recursion(defun fib(n) (cond ((< n 1) 0) ((= n 1) 1) (t (+ (f (- n 2)) (f (- n 1))))))
  6. 6. 04. Dynamic Programming動的計画法は、コンピュータ科学の分野において、ある最適化問題を複数の部分問題に分割して解く際に、そこまでに求められている以上の最適解が求められないような部分問題を切り捨てながら解いていく手法である。 動的計画法 - Wikipedia
  7. 7. 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))))
  8. 8. 05. Memoizationメモ化とは、プログラムの高速化のための最適化技法の一種であり、サブルーチン呼び出しの結果を後で再利用するために保持し、そのサブルーチン(関数)の呼び出し毎の再計算を防ぐ手法である。 メモ化 - Wikipedia
  9. 9. 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)))
  10. 10. 07. Lastご清聴ありがとうございました!

×