あどけない話スマートフォン用の表示で見るあどけない話インターネットに関する技術的な話など2010-12-28フィボナッチ数列のまとめHaskellフィボナッチ数列は、自然界に現れる単純にして基本的な数列である。ヒマワリの種の並びやミツバチの家系図はフィボナッチ数列を成す。実装すると以下のようになる。フィボナッチ数列は、もともとウサギのつがいの話だから後者の方が正統だが、前者の方が数学的には美しい。漸化式は、すなわちトップダウン的な表現であり、理解しやすい。この実装は同じ値を何度も計算するので、とても遅い。単純な再帰を反復(ループ)に変形してみよう。それには、関数が末尾再帰の形になればよい。末尾再帰へ変換する定石は、引数に蓄積変数を追加することである。今回は、蓄積変数が2つ必要になる。増加するカウンターとして使っているが、減少するカウンターを使っても実装できる。興味があれば考えてほしい。反復はボトムアップな解決方法である。漸化式を素直に実装した版を高速にするには、メモ化が使える。メモ化のために、まず不動点コンビネータとフィボナッチ数列の汎関数を用意しよう。いう名前では再帰していないことに注意。55もちろん、このままだと遅い。メモ化(1)不動点コンビネータにメモ化の機能を入れる。用いて副作用を発生させる。使うと、メモ化が効いて高速になる。これを使えば、フィボナッチ数列を以下のように実装できる。2)メモ化(3)フィボナッチ数列に対しては、遅延評価を用いたメモ化の方法が知られている。この実装は、芸術的である。fibs)分割統治フィボナッチ数列は、分割統治することで、対数時間で計算できることが知られている。以下のようなコードになる。問題1.19を参照のこと。最速フィボナッチ数列は、黄金比と密接な関係があり、黄金比からの単純な計算で求められる。5この式はダニエル・ベルヌーイが1728年に発見した。一般的には、母関数を使うと導出できる。なってしまい、欲しい関数とはいえない。求める式が知られている。2あわせて読みたい自然界にフィボナッチ数列がどのように現れるのかは、以下の本が詳しい。以下の内容は比較的どうでもいいことなので、暇な人だけ読んで...2010-12-21禁断の不動点コンビネータフィボナッチ数列を汎関数で書く。山本和彦id:kazu-yamamoto子育て真っ最中のHaskeller。Haskell月別アーカイブはてなブログをはじめよう!kazu-yamamotoさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。