# フィボナッチ数列を出力する1行プログラム(Ruby vs C#)
_published: 2008/01/11_ 
フィボナッチ数列を出力するプログラム。再帰関数で計算するサンプルが多いですが、順番に表示するだけならループでいけます。
このプログラムを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の勝ち。