2009年09月17日

C#でフィボナッチ数列を求める

   このエントリーをはてなブックマークに追加 Clip to Evernote
以前、もうひとつのBlog「Gushwell's F# Programming Diary」で、 「F#: Seqを使ってフィボナッチ数列を求める 」 という記事を書きましたが、そこで示したコードをC#に移植してみました。

フィボナッチ数列に定義は

f(0) = 0
f(1) = 1
f(n) = f(n-2) + f(n-1)    n >= 2

です。ここでは、f(0)=0 と0から始まる定義としました。
以下、フィボナッチ数列を求めるFibonacciクラスのコードです。


以下、使い方の例です。


このFibonacciクラスは、 IEnumerable を実装しているので、foreachが使えます。
ただし、数列を無限に求めていますので、LINQのTakeメソッドを使い、指定した数だけ取り出すようにしています。


この記事へのコメント
これって、int の範囲をF(47)あたりでオーバーフローしますよね。
まあ、/checked+ でコンパイルすれば、例外としてキャッチはできるんでしょうけど、
こういう場合は、例外として処理すべきなんでしょうか?
それとも、
オーバーフローする時点で、無限列を終了させるべきなんでしょうか?
(つまりこのクラスは有限列)
Posted by BLUEPIXY at 2009年09月18日 01:40
オーバーフローの件、やはり突っ込まれました(笑)

例外か終了かは、難しい問題ですね。
あえてどちらかを決めるならば、例外を発生させるかな。
そうしないと、オーバーフローしたことに気がつかないで
処理が進んでしまう可能性がありますから。

Posted by Gushwell at 2009年09月18日 12:41
記事に直接関係ないことを質問してすみませんです。
別にツッコミというわけではなくて、
何らかのクラスを作る場合、
クラスが例外を投げる
例外を投げずにクラス内で処理する。
使う側で処理する。
とか、色々と悩みどころですので、ちょっと聞いてみたかったのです。

/checked+ オプションなんて自分、書いてますけど、
checked キーワードの方がいいでしょうね、多分。

>処理が進んでしまう可能性があります
無限列を終了させる:yield break;
していいれば、処理は進まないような気がしますが・・
Posted by BLUEPIXY at 2009年09月19日 19:12
>無限列を終了させる:yield break;

ああ、そうですね。
僕のクラスを作る基本的なスタンスは、
「例外を呼び出し元に投げる」
なんですが、
この場合は、難しいなー。
Posted by Gushwell at 2009年09月19日 20:59
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/51894000