ループを使わずに1から10までの総和を表示するプログラム

わんくま界隈で流行っているので、遅ればせながら参戦。

ループがだめなら、再帰でしょ。C# で実装。

Func<int, int> func = null;
func = n => (1 < n) ? n + func(n - 1) : n;
Console.WriteLine(func(10));

「10 から 1 になってる」って?

             /)
           ///)
          /,.=゙''"/
   /     i f ,.r='"-‐'つ____   こまけぇこたぁいいんだよ!!
  /      /   _,.-‐'~/⌒  ⌒\
    /   ,i   ,二ニ⊃( ●). (●)\
   /    ノ    il゙フ::::::⌒(__人__)⌒::::: \
      ,イ「ト、  ,!,!|     |r┬-|     |
     / iトヾヽ_/ィ"\      `ー'´     / 

これだけでは面白くないので、「Y Combinator」 ってやつを使ってみます。

static void Main(string[] args)
{
    // Y Combinator を使って、再起を1行で書く
    Console.WriteLine(Fix<int>(f => n => (1 < n) ? n + f(n - 1) : n)(10));
    Console.ReadLine();
}

// Y Combinator
static Func<T, T> Fix<T>(Func<Func<T, T>, Func<T, T>> F)
{
    return t => F(Fix(F))(t);
}

Y Combinator については、次の記事を参照して下さい。

自分は、まだ完全に理解できていません。ムズカシイorz

追記

最初のサンプルを、ちゃんと「1 から 10 まで」に書き換えてみた。

Func<int, int, int> f = null;
f = (n, m) => (n < m) ? n + f(n + 1, m) : n;
Console.WriteLine(f(1, 10));

Y Combinator の方は…ムズイ。