継続渡しスタイル

C#でも無名関数作れるし、ここを参考にやってみた。
# トラックバックの使い方がわかりません orz

class Program
{
  // 継続(っていうの?)への参照
  delegate int Method(int a);

  static void Main(string[] args)
  {
    //////////////////////////////////////
    // 2通りの方法で階乗を求める
    //////////////////////////////////////

    // まず、通常の計算
    Console.WriteLine("10! = " + Fact(10));

    // 次に、継続渡しによる計算
    Console.WriteLine("10! = " + FactCps(10, delegate(int a) { return a; }));

    return;
  }

  // 階乗を求める通常の関数
  static int Fact(int n)
  {
    return n == 0 ?
      1 :
      n * Fact(n - 1);
  }

  // 継続渡しにより階乗を求める関数
  static int FactCps(int n, Method method)
  {
    return n <= 0 ?
      method(1) :
      FactCps(n - 1, delegate(int a) { return method(a * n); });
  }
}

計算過程を追っていくので精いっぱい。
Factは自分自身で階乗計算をやっているのに対し、FactCpsは継続に委譲している感じ?
そこがメリットでもあるのかな。処理内容を外部から差し替え可能にする感じ?


使い慣れている言語で書いてみりゃ少しくらい...、って考えた僕が甘かった。
やっぱムズい。


FactCpsに渡す関数は再帰定義なの?
いや、まったく別の関数methodを使って定義した関数だし、再帰じゃないよなー。
でもmethod(n)の値がすぐ決まらない感じ、なんか再帰のモヤモヤ感と似てるなぁ。
いや、method(n)の値はnやわ。めっさ簡単やん。
なんじゃこりゃ。わけわからん。
発狂しそう。


FactCps関数が再帰するわ、methodがモヤモヤ感たっぷりやわでもう大変です。
たぶん分かる人が見たらmultirember&coもFactCpsも同じなんだろうけど、
なんとなくmultirember&coの方が分かりやすい気がする。