Haskellでフィボナッチメモ化再帰
さっき挙げたプログラムだとfib(40)ぐらいでもう数十秒ぐらいかかり、だいぶ遅いです。
メモ化再帰フィボナッチをメモしておきます
fib 0 = 0 fib 1 = 1 fib x = (fiblist !! (x-1) + fiblist !! (x-2)) fiblist = [fib x | x <- [0,1..]]
実行結果
ghci> fib 5000 3878968454388325633701916308325905312082127714646245106160597214895550139044037097010822916462210669479293452858882973813483102008954982940361430156911478938364216563944106910214505634133706558656238254656700712525929903854933813928836378347518908762970712033337052923107693008518093849801803847813996748881765554653788291644268912980384613778969021502293082475666346224923071883324803280375039130352903304505842701147635242270210934637699104006714174883298422891491273104054328753298044273676822977244987749874555691907703880637046832794811358973739993110106219308149018570815397854379195305617510761053075688783766033667355445258844886241619210553457493675897849027988234351023599844663934853256411952221859563060475364645470760330902420806382584929156452876291575759142343809142302917491088984155209854432486594079793571316841692868039545309545388698114665082066862897420639323438488465240988742395873801976993820317174208932265468879364002630797780058759129671389634214252579116872755600360311370547754724604639987588046985178408674382863125
5000項目でも一瞬で計算できます。多倍長標準実装スゴイ。
いろいろ買い物&スタジオ作りました
今日は街に行ってフィギュアの撮影スタジオの材料とかを買いに行きました。
ついでに夏休みに使う予定の青春18きっぷも買っておきました!!たのしみです
東急ハンズで買い物しましたが、いろいろなものがあって目移りしましたね。
理化学コーナーにビーカーやらいろいろな実験用具が売っていて、専攻は違えどなかなかわくわくしました。
結局あまり買わなかったんですけどまた行きたいです。
さらに大きい書店に寄ってコンピュータの棚をみてると、関数型言語Haskellの参考書『すごいHaskellたのしく学ぼう!』、
(通称すごいH本)が売っていたのでなかなか値は張りましたが買ってしまいました。関数型言語はまだ触れたことがないので楽しみです。
うちに帰ったら早速スタジオを作りました。
ダンボールの床と壁に白い紙を貼り、上からUSB給電のLED光源で照らすだけの簡素なものです。
ダンボールの切り出しに苦戦しつつも完成しました。(わりとでかい
↓こんな漢字
↓こんな漢字
上から照らしてるだけなので正面からも照らしたいんですが、直接当てると影がなかなか目立ちます。
角のほうの影もちょっと問題なのでそのへんを直していきたいです
はてぶで数式を書く
動的計画法のアレを書いてて数式がはてぶで書けたらいいなと思ったらどうやらTexが書けるようで
k's diary様のサイトを参考にしました↓
TeXで数式をはてなブログに表示する - k's diary
で数式の表示
DP\left\[k\right\]\left\[n\right\] = \displaystyle\sum_{(s∈S)} (DP\left\[k-1\right\]\left\[n\right\] \times DP\left\[k-1\right\]\left\[s\right\] \times EloRate(n,s))
>自分のターンのとき\\ dp\left\[left\right\]\left\[right\right\] = max\{dp\left\[left\right\]\left\[right-1\right\] + b\left\[B-right+1\right\] ,dp\left\[left-1\right\]\left\[right\right\] + a\left\[A-left+1\right\]\} (left \neq 0 \land right \neq 0 のとき)\\ dp\left\[left\right\]\left\[right\right\] = dp\left\[left\right\]\left\[right-1\right\] + b\left\[B-right+1\right\] (left = 0のとき)\\ dp\left\[left\right\]\left\[right\right\] = dp\left\[left-1\right\]\left\[right\right\] + a\left\[A-left+1\right\] (right = 0のとき)\\ >相手のターンのとき\\ dp\left\[left\right\]\left\[right\right\] = min\{dp\left\[left\right\]\left\[right-1\right\],dp\left\[left-1\right\]\left\[right\right\] \}(left \neq 0 \land right \neq 0 のとき)\\ dp\left\[left\right\]\left\[right\right\] = dp\left\[left\right\]\left\[right-1\right\](left = 0のとき)\\ dp\left\[left\right\]\left\[right\right\] = dp\left\[left-1\right\]\left\[right\right\](right = 0のとき)\\
配列の括弧の表示が面倒ですね...