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の方が分かりやすい気がする。