ToDo:
Y = With[{core = #}, With[{procedure = #}, core[procedure[procedure][##]&]]&[ With[{procedure = #}, core[procedure[procedure][##]&]]&]]&;
生成した再帰関数を包むpure functionで、##を 受けとるようにしただけ
リストの平均値を求める
avgY = Y[With[{action = #}, Which[ Length[{##}] < 3, action[#1, 0, 0], Length[#1] > 0, action[Rest[#1], #2 + 1, #3 + First[#1]], True, #3 / #2]&]&];
リストの標準偏差を求める
sigmaY = Y[With[{action = #}, Which[ Length[{##}] < 4, action[#1, 0, 0, Y[With[{action = #}, Which[ Length[{##}] < 3, action[#1, 0, 0], Length[#1] > 0, action[Rest[#1], #2 + 1, #3 + First[#1]], True, #3 / #2]&]&][#1]], Length[#1] > 0, action[Rest[#1], #2 + 1, #3 + (First[#1] - #4)^2, #4], True, Sqrt[#3 / (#2 - 1)]]&]&];
最初に平均値を求める部分に avgY相当の無名関数を使っている
単純な再帰を Y-Combinatorで書いた基本形
factY = Y[With[{action = #}, Which[ # < 1, 1, True, # * action[# - 1]]&]&];
アキュムレータを導入して、末尾再帰化
factY = Y[With[{action = #}, Which[ Length[{##}] < 2, action[#, 1], #1 < 1, #2, True, action[#1 - 1, #2 * #1]]&]&];
最初の呼び出し(アキュムレータの初期化)を再帰の外に出した移す
factY = Y[With[{action = #}, Which[ #1 < 1, #2, True, action[#1 - 1, #2 * #1]]&]&][#, 1]&;
カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記