# フィボナッチ数列を出力する1行プログラム(Ruby vs C#) _published: 2008/01/11_ ![alt](http://b.hatena.ne.jp/entry/image/http://d.hatena.ne.jp/shunsuk/20080111/1200055004) フィボナッチ数列を出力するプログラム。再帰関数で計算するサンプルが多いですが、順番に表示するだけならループでいけます。 このプログラムを1行で書いてみます。Rubyだとこう書けます。 ```ruby lambda{|a,b|10.times{p b=(a=a+b)-b}}.call(1,0) ``` このパターンは、これと一緒。 - [[n!(nの階乗)を求めるプログラムを1行で書いてみる。]] `Array` に格納して、一気に出力するには。 ```ruby lambda{|a,b,x|p x if 10.times{xb=(a=a+b)-b}}.call(1,0,[]) ``` 次は、C#で。最初は無理かと思っていましたが、ひらめいてしまいました。いきなり、結論を書きます。C#2.0以降でお願いします。C#3.0だと、もっとシンプルに書けるかも。 ```cs new EventHandler(delegate(object s,EventArgs e){while(((int[])s)[2]++<10)if(Console.WriteLine(((int[])s)[1]=(((int[])s)[0]=((int[])s)[0]+((int[])s)[1])-((int[])s)[1])is Object){}}).Invoke(new int[]{1,0,0},null); ``` 変数の初期化の考え方はRubyと同じです。でも、 `Delegate` はabstractなので使えません。そこで、 `Delegate` 派生の `EventHandler` を使いました。 `EventHandler` も、こんな使われ方をされるとは思っていなかったでしょう。 `for` だとセミコロンが入ってイヤな感じなので、 `while` で。あと、 `Console.WriteLine()` を普通に書くと、文なのでセミコロンを付けないといけません。そこで、 `if` の条件式に入れています。 `Console.WriteLine()` は戻り値が `Void` なので、 `==` などで条件式に含めることができません。それを、 `is` を使うことによって対応しています。 これはもう、天翔龍閃ですね。でも、Ruby vs C#ということなら、どう考えてもRubyの勝ち。