遅延 × 再帰 × フィボナッチ

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]

再帰と遅延評価はそれぞれ理解していたつもりだけど こうやって組み合わされると一瞬「ん?これで動くの?」と考えてしまう。
まだ思考がこっち側になれていないみたい。

知識だけではすんなり頭に入っていかないこの感覚はまさに数学のそれに似てるな。 おもしろい。

blog comments powered by Disqus
Get Adobe Flash playerPlugin by wpburn.com wordpress themes

About this blog

私 manjilab のポータル的サイトになっております。日々気付いたこと、考えたこと、発表したいものを載せていきます。

Photostream

    Lisp indent 考察Lisp indent 考察Lisp indent 考察Lisp indent 考察Lisp indent 考察Tips to use Clojure(Lisp) with TextMateTips to use Clojure(Lisp) with TextMateTips to use Clojure(Lisp) with TextMate