2010年10月11日

C#でunfold

   このエントリーをはてなブックマークに追加 Clip to Evernote
T_GYOUTENさんの記事 に触発されて、C#で3つのUnfold関数を書いてみました。

名前をどうしようか迷ったのですが、Unfoldクラスを定義し、そこに Do メソッドを定義
することにしました。一つの機能しかないstaticクラスを作る時には、名前をどうするか
悩みますね。
引数の順番は、F#とは逆にし、初期値, generator の順にしました。

まずは、一つ目のバージョンのUnfold.Doメソッド
使い方はこんな感じ。
true, false が繰り返されます。
generatorが null を返すと終了しますが、Tが値型の場合、nullがとれないので、
無限に繰り返すことになります。

2つめは、繰り返し条件を指定できるバージョン。これならば、値型でも有限のシーケンスを 得ることが できます。
使い方です。
1 2 4 8 16 32 64 128 256 512 と表示されます。

最後は、最も汎用性のあるバージョンで、F#のSeq.unfoldとほぼ同等のものです。
Tupleを使っているので、ちょっと分かりにくいかもしれませんが、
これだと、初期値に与える型と、戻り値の各要素の型を別のものにすることができます。

以下、使い方の例です。
true, false を繰り返しています。 これだと、最初に示した true, false を返すコードのほうが簡単なので、
このTuple使ったDoメソッドだからできる例を示します。
フィボナッチ数列を求めるコードです。
unfoldは強力ですが、使うにはちょっと慣れが必要ですね。



この記事へのコメント
なるほどC#4.0では、こんな風になるのですね。
話は変わりますが、ただいまgushwellさんのメールマガジンのバックナンバーでLINQ勉強中です。お世話になっております。
Posted by T_GYOUTEN at 2010年10月12日 22:15
C#4.0のカテゴリにしましたが、正確には「.NET Framework4 を使ったコード」でしたね。(^^;

メールマガジンがお役に立っているようで、何よりです。
LINQは、ちょっとしたWebページよりも、詳しい内容になっているんじゃないかと、密かに思っています。
気がついたことがあれば、遠慮なく仰ってください。

Posted by Gushwell at 2010年10月13日 00:04
 

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

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