いわゆる卍研究所。
In: Programming
12 11月 2009長らく連載がストップしている某マンガ風なタイトルで。
Clojureのドキュメントやチュートリアルでよく見かけるフィボナッチ数列を求める関数定義:
(def fibs (lazy-cat [0 1] (map + fibs (rest fibs))))
一見しただけでは えっ?これで動くの? と感じてしまうのだが 紙の上で動かしてみるとなるほど納得できた。
2行目の map関数での処理部分はつまることろ
fibs: 0 1 1 2 3 5 ... (rest fibs): 1 1 2 3 5 8 ... ;---------------------------------- 0 1 +: 1 2 3 5 8 13 ...
と、まさにフィボナッチ数の定義そのままをコードにしたもの。
動作も順を追っていくと理解できる。
[0 1] ; -> [0 1] [0 1] + (map + [0 1] [1]) ; -> [0 1 1] [0 1] + (map + [0 1 1] [1 1]) ; -> [0 1 1 2] [0 1] + (map + [0 1 1 2] [1 1 2]) ; -> [0 1 1 2 3]
再帰と遅延評価はそれぞれ理解していたつもりだけど
こうやって組み合わされると一瞬「ん?これで動くの?」と考えてしまう。
まだ思考がこっち側になれていないみたい。
知識だけではすんなり頭に入っていかないこの感覚はまさに数学のそれに似てるな。 おもしろい。
私 manjilab のポータル的サイトになっております。日々気付いたこと、考えたこと、発表したいものを載せていきます。