SlideShare a Scribd company logo
1 of 16
00. First


数列で学ぶ初めての CommonLisp

      # fibonacci


       2012-04-28
01. Profile


  Akiko Terada (@pgf2)

Work : software developer
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)
03. Divide and conquer algorithm


           先ずは直感

         分割統治法!!
03. Divide and conquer algorithm


分割統治法は、そのままでは解決できない問題を
小さな問題に分割することで、最終的に問題を解
決しようとする考え方。また、その方法やアルゴ
リズム。

                    分割統治法 - Wikipedia
03. Divide and conquer algorithm


(defun fib(n)
 (cond ((< n 1) 0)
        ((= n 1) 1)
        (t (+ (f (- n 2)) (f (- n 1))))))
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)

 計算コストが指数的に拡散してしまう!
04. Dynamic Programming


トップダウンが駄目ならボトムアップ

      動的計画法!!
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


    他には?

   メモ化!!
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)))
05. Memoization


計算コストと領域コストの問題発生

   難しいのでパス :-)
06. Conclusion
● 分割統治法
 → 計算コスト

● 動的計画法
 → ?

● メモ化
 → 領域コスト

   コスト考えるなら動的計画法!
07. Last



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

More Related Content

What's hot

ggplot2再入門(2015年バージョン)
ggplot2再入門(2015年バージョン)ggplot2再入門(2015年バージョン)
ggplot2再入門(2015年バージョン)yutannihilation
 
最適化の手前の数学
最適化の手前の数学最適化の手前の数学
最適化の手前の数学俊介 後藤
 
【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しよう【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しようUnity Technologies Japan K.K.
 
私を SKI に連れてって
私を SKI に連れてって私を SKI に連れてって
私を SKI に連れてってSusisu
 
はんなりPython#42 20210629
はんなりPython#42 20210629はんなりPython#42 20210629
はんなりPython#42 20210629takey Takesue
 
Magnitude ~ extend the Euler Characteristics via Möbius Inversion ~
Magnitude ~ extend the Euler Characteristics via  Möbius Inversion ~Magnitude ~ extend the Euler Characteristics via  Möbius Inversion ~
Magnitude ~ extend the Euler Characteristics via Möbius Inversion ~Tatsuki SHIMIZU
 
Infinite SVM - ICML 2011 読み会
Infinite SVM - ICML 2011 読み会Infinite SVM - ICML 2011 読み会
Infinite SVM - ICML 2011 読み会Shuyo Nakatani
 
kagami_comput2016_07
kagami_comput2016_07kagami_comput2016_07
kagami_comput2016_07swkagami
 
アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法nitoyon
 
kagami_comput2015_7
kagami_comput2015_7kagami_comput2015_7
kagami_comput2015_7swkagami
 
ディジタル信号処理 課題解説 その5
ディジタル信号処理 課題解説 その5ディジタル信号処理 課題解説 その5
ディジタル信号処理 課題解説 その5noname409
 
SICP
SICPSICP
SICPS W
 

What's hot (20)

ggplot2再入門(2015年バージョン)
ggplot2再入門(2015年バージョン)ggplot2再入門(2015年バージョン)
ggplot2再入門(2015年バージョン)
 
ggplot2 110129
ggplot2 110129ggplot2 110129
ggplot2 110129
 
最適化の手前の数学
最適化の手前の数学最適化の手前の数学
最適化の手前の数学
 
【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しよう【Unity道場】ゲーム制作に使う数学を学習しよう
【Unity道場】ゲーム制作に使う数学を学習しよう
 
CG2013 03
CG2013 03CG2013 03
CG2013 03
 
私を SKI に連れてって
私を SKI に連れてって私を SKI に連れてって
私を SKI に連れてって
 
CG2013 07
CG2013 07CG2013 07
CG2013 07
 
CG2013 02
CG2013 02CG2013 02
CG2013 02
 
CG2013 05
CG2013 05CG2013 05
CG2013 05
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
はんなりPython#42 20210629
はんなりPython#42 20210629はんなりPython#42 20210629
はんなりPython#42 20210629
 
Magnitude ~ extend the Euler Characteristics via Möbius Inversion ~
Magnitude ~ extend the Euler Characteristics via  Möbius Inversion ~Magnitude ~ extend the Euler Characteristics via  Möbius Inversion ~
Magnitude ~ extend the Euler Characteristics via Möbius Inversion ~
 
Infinite SVM - ICML 2011 読み会
Infinite SVM - ICML 2011 読み会Infinite SVM - ICML 2011 読み会
Infinite SVM - ICML 2011 読み会
 
kagami_comput2016_07
kagami_comput2016_07kagami_comput2016_07
kagami_comput2016_07
 
アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法
 
CG2013 06
CG2013 06CG2013 06
CG2013 06
 
CG2013 01
CG2013 01CG2013 01
CG2013 01
 
kagami_comput2015_7
kagami_comput2015_7kagami_comput2015_7
kagami_comput2015_7
 
ディジタル信号処理 課題解説 その5
ディジタル信号処理 課題解説 その5ディジタル信号処理 課題解説 その5
ディジタル信号処理 課題解説 その5
 
SICP
SICPSICP
SICP
 

Viewers also liked

framework.net -Jennifer Suarez
framework.net -Jennifer  Suarezframework.net -Jennifer  Suarez
framework.net -Jennifer SuarezGinsuaC
 
Via Global (Grupo Viatek)
Via Global (Grupo Viatek)Via Global (Grupo Viatek)
Via Global (Grupo Viatek)Grupo Viatek
 
K hernandez speech_of_intro
K hernandez speech_of_introK hernandez speech_of_intro
K hernandez speech_of_introraiderkr
 
7a moshin олимп_ch
7a moshin олимп_ch7a moshin олимп_ch
7a moshin олимп_chval28
 
Os máis altos!!!
Os máis altos!!!Os máis altos!!!
Os máis altos!!!Bergantera
 

Viewers also liked (7)

7. sinif 5. üni̇te
7. sinif 5.  üni̇te7. sinif 5.  üni̇te
7. sinif 5. üni̇te
 
framework.net -Jennifer Suarez
framework.net -Jennifer  Suarezframework.net -Jennifer  Suarez
framework.net -Jennifer Suarez
 
Via Global (Grupo Viatek)
Via Global (Grupo Viatek)Via Global (Grupo Viatek)
Via Global (Grupo Viatek)
 
Saletinho 2013
Saletinho 2013    Saletinho 2013
Saletinho 2013
 
K hernandez speech_of_intro
K hernandez speech_of_introK hernandez speech_of_intro
K hernandez speech_of_intro
 
7a moshin олимп_ch
7a moshin олимп_ch7a moshin олимп_ch
7a moshin олимп_ch
 
Os máis altos!!!
Os máis altos!!!Os máis altos!!!
Os máis altos!!!
 

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

命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへNaoki Kitora
 
Rでマンデルブロ集合
Rでマンデルブロ集合Rでマンデルブロ集合
Rでマンデルブロ集合Yoshiteru Kamiyama
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座bleis tift
 
How to study stat
How to study statHow to study stat
How to study statAk Ok
 
Incanterの紹介
Incanterの紹介Incanterの紹介
Incanterの紹介mozk_
 
自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章Hiroki Mizukami
 
【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター 【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター Unity Technologies Japan K.K.
 
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編Unity Technologies Japan K.K.
 
ディープニューラルネット入門
ディープニューラルネット入門ディープニューラルネット入門
ディープニューラルネット入門TanUkkii
 
関数プログラミングことはじめ
関数プログラミングことはじめ関数プログラミングことはじめ
関数プログラミングことはじめNaoki Kitora
 
関数プログラミング ことはじめ (再)
関数プログラミング ことはじめ (再)関数プログラミング ことはじめ (再)
関数プログラミング ことはじめ (再)Suguru Hamazaki
 
TensorflowとKerasによる深層学習のプログラム実装実践講座
TensorflowとKerasによる深層学習のプログラム実装実践講座TensorflowとKerasによる深層学習のプログラム実装実践講座
TensorflowとKerasによる深層学習のプログラム実装実践講座Ruo Ando
 
2値分類・多クラス分類
2値分類・多クラス分類2値分類・多クラス分類
2値分類・多クラス分類t dev
 
化学科自主ゼミ1
化学科自主ゼミ1化学科自主ゼミ1
化学科自主ゼミ1Hiroki Sato
 
代数トポロジー入門
代数トポロジー入門代数トポロジー入門
代数トポロジー入門Tatsuki SHIMIZU
 
Or seminar2011final
Or seminar2011finalOr seminar2011final
Or seminar2011finalMikio Kubo
 

Similar to 数列で学ぶ初めての CommonLisp #fibonacci (18)

命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
 
Rでマンデルブロ集合
Rでマンデルブロ集合Rでマンデルブロ集合
Rでマンデルブロ集合
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
 
How to study stat
How to study statHow to study stat
How to study stat
 
Incanterの紹介
Incanterの紹介Incanterの紹介
Incanterの紹介
 
自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章
 
【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター 【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター
 
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
 
ディープニューラルネット入門
ディープニューラルネット入門ディープニューラルネット入門
ディープニューラルネット入門
 
関数プログラミングことはじめ
関数プログラミングことはじめ関数プログラミングことはじめ
関数プログラミングことはじめ
 
関数プログラミング ことはじめ (再)
関数プログラミング ことはじめ (再)関数プログラミング ことはじめ (再)
関数プログラミング ことはじめ (再)
 
Lispでやる記号微分
Lispでやる記号微分Lispでやる記号微分
Lispでやる記号微分
 
Prml07
Prml07Prml07
Prml07
 
TensorflowとKerasによる深層学習のプログラム実装実践講座
TensorflowとKerasによる深層学習のプログラム実装実践講座TensorflowとKerasによる深層学習のプログラム実装実践講座
TensorflowとKerasによる深層学習のプログラム実装実践講座
 
2値分類・多クラス分類
2値分類・多クラス分類2値分類・多クラス分類
2値分類・多クラス分類
 
化学科自主ゼミ1
化学科自主ゼミ1化学科自主ゼミ1
化学科自主ゼミ1
 
代数トポロジー入門
代数トポロジー入門代数トポロジー入門
代数トポロジー入門
 
Or seminar2011final
Or seminar2011finalOr seminar2011final
Or seminar2011final
 

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