Weitere ähnliche Inhalte
Ähnlich wie 数列で学ぶ初めての CommonLisp #fibonacci (18)
数列で学ぶ初めての CommonLisp #fibonacci
- 2. 01. Profile
Akiko Terada (@pgf2)
Work : software developer
- 3. 02. fibonacci
-55 34 -21 13 -8 5 -3 2 -1 1 0 1 1 2 3 5 8 13 21 34 55
F(0) = 0
F(1) = 1
F(n) = F(n-2)+F(n-1) (n >= 2)
F(-n) = (-1)^{n+1}*F(n)
- 5. 03. Divide and conquer algorithm
分割統治法は、そのままでは解決できない問題を
小さな問題に分割することで、最終的に問題を解
決しようとする考え方。また、その方法やアルゴ
リズム。
分割統治法 - Wikipedia
- 6. 03. Divide and conquer algorithm
(defun fib(n)
(cond ((< n 1) 0)
((= n 1) 1)
(t (+ (f (- n 2)) (f (- n 1))))))
- 7. 03. Divide and conquer algorithm
F(2) = F(1) + F(0)
F(3) = F(2) + F(1)
= F(1) + F(0) + F(1)
F(4) = F(3) + F(2)
= F(2) + F(1) + F(1) + F(0)
= F(1) + F(0) + F(1) + F(1) + F(0)
計算コストが指数的に拡散してしまう!
- 10. 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))))
- 13. 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)))