ãã®ã¨ã³ããªã®
親友へ。ブログを書こう。 - IT戦記
y ãããã°ãå§ããã¿ãããªã®ã§ãèªãã§ã¿ãã
ã§ãææ°ã®ã¨ã³ããªãèªãã§ã¿ããã
Y ã³ã³ããã¼ã¿ã¨ãããã®ã«ã¤ãã¦æ¸ãã¦ãã£ãã®ã§ã
Y Combinatorが凄すぎる! - yuji1982の日記
Y ã³ã³ããã¼ã¿ã£ã¦ä½ã£ã¦ã¨ãããããèªåã§ãããããèãã¦ã¿ãã
çµå±ãªããªã®ããã£ã±ãåãããªãã£ããã§ãããèªåãèãããã¨ãã¾ã¨ãã¦ãã
ã¾ãããã£ããããæ°ãæ±ãã fib ãå®ç¾©ãã
var fib = function(n){ return (n <= 2) ? 1 : (arguments.callee(n-1) + arguments.callee(n-2)); }; fib(10);
ããï¼ JS ããã¼ï¼åå㯠n ãã使ã£ã¦ãã¼ãï¼
ãã§ããããã§ãããããããããªãã¦ï¼
JS ãç´ æ´ããéãã¦è©±ãçµãã£ã¦ãã¾ã£ãã®ã§ arguments.callee ãç¦æ¢ã«ãã¦æ¸ãã¦ã¿ã
var fib = function f(n){ return (n <= 2) ? 1 : (f(n-1) + f(n-2)); }; fib(10);
n, f ã ãååã使ã£ãï¼ã§ããã°ãã¼ãã«æ±æãã¦ãªãï¼ï¼ï¼ JS ããã¼ï¼
ãã§ããããã§ãããããããããªãã¦ï¼
JS ãç´ æ´ããéãã¦è©±ãçµãã£ã¦ãã¾ã£ãã®ã§ãååä»ãé¢æ°å®ç¾©ãç¦æ¢ã«ãã¦æ¸ãã¦ã¿ã
var fib = function(n){ return (n <= 2) ? 1 : (fib(n-1) + fib(n-2)); }; fib(10);
ã§ãããã§ã®åé¡ç¹ãèããã
ããã»ã©ã® fib ã§ã¯ã°ãã¼ãã«ãªã¹ã³ã¼ãã«å®ç¾©ããã¦ããã®ã§ã以ä¸ã®ããã«ä½ããªãé¢æ°åãå¤æ´ããå ´ååããªãããªã£ã¦ãã¾ãã¾ãã
var _fib = fib; // _fib ã¨ããååã« fib é¢æ°ãä»£å ¥ fib = null; // å ã® fib ãæ¶ã _fib(10); // 失æãã
ã©ããã£ã¦ããã解決ããã°ããã ããã
以ä¸ã®ããã«ããã°ããã
var fib = (function() { var fib = function(n){ return (n <= 2) ? 1 : (fib(n-1) + fib(n-2)); }; return fib; })(); fib(10)
ããã Y ã³ã³ããã¼ã¿ã®åç¹ãªã®ãããããªãã¨ãæã£ãããªãã¨ãªããã§ãé¢ä¿ãªããªãã¶ã
ã§ãæ¬é¡ã«å ¥ã
λè¨ç®ã¨ãããã®ã®è©±ã«ãªããλè¨ç®ã¨ã¯ JS ã®ä¸çã§ãã㨠= ã使ããªããé¢æ°èªä½ã«ååãä»ããªããé¢æ°ã¯å¼æ° 1 åã 0 åããæããªããé¢æ°ã¯ä¸ã¤ã® return æã ããæ㤠JavaScript ã®å¼ã¨ãããã¨ãªã®ããªï¼ã¨æã£ã¦ãã¾ããéãï¼
ãããä½ã«å½¹ç«ã¤ããåããã¾ããããã ããã¹ã¦ã®è¨ç®ã¯ããã§è¡¨ç¾ã§ãããããã§ãããã®ãã¨ãä½ãªã®ãã¯åã«ã¯åããã¾ããã
ã¨ãã訳ã§
ããã
var fib = (function() { var fib = function(n){ return (n <= 2) ? 1 : (fib(n-1) + fib(n-2)); }; return fib; })(); fib(10)
ãããã風ã«å¤æãã¦ãã£ã¦ã¿ã
ã¾ãã°ãã¼ãã«ã® fib ãç¡ãã
var fib = (function() { var fib = function(n){ return (n <= 2) ? 1 : (fib(n-1) + fib(n-2)); }; return fib; })(); fib(10)
ããã§ãé¢æ°ã®å¼ã³åã決ãã¦ããã¾ããã
(function() { // âãããå¤ã®é¢æ° var fib = function(n){ // âãããä¸ã®é¢æ° return (n <= 2) ? 1 : (fib(n-1) + fib(n-2)); }; return fib; })()(10);
ã¨å¼ã¶äºã«ãã¾ãã
ãã¼ã«ã«ã® fib ãç¡ãããã
ãã®ã³ã¼ãã¯åããªãã§ãã
(function(f) { // â ããã«ä¸ã®é¢æ°ãå ¥ããããã°ãã¼ã«ã«ã® fib ãç¡ããã return function(n){ return (n <= 2) ? 1 : (f(n-1) + f(n-2)); }; })()(10);
ããã«ãå¤ã®é¢æ°ãå¥ã®é¢æ°ã§åãåã£ã¦ã¿ã
ãã®ã³ã¼ãã¯åããªãã§ãã
(function(f) { // â ããã«å¤ã®é¢æ°ãå ¥ãã return f(/* ããã«ä¸ã®é¢æ°ãå ¥ããããã° */) })(function(f) { // â ããã«ä¸ã®é¢æ°ãå ¥ã£ã¦ããã¯ã return function(n){ return (n <= 2) ? 1 : (f(n-1) + f(n-2)); }; })(10);
ããã«ãèãã
(function(f) { return f(/* ããã«ä¸ã®é¢æ°ãå ¥ããããã°ããã®é¢æ°ã¯ä¸ã®é¢æ°ãè¿ãã¯ã */) })(function(f) { return function(n){ return (n <= 2) ? 1 : (f(n-1) + f(n-2)); }; })(10);
ããã«ãããã
(function(f) { // ãã®é¢æ°ã¯ f ã«ãä¸ã®é¢æ°ããå ¥ããã°ããä¸ã®é¢æ°ããè¿ã return function g(m) { // âãæãç«ã¤ã¨ â ã® f ããä¸ã®é¢æ°ããè¿ã return f(g)(m); }; })(function(f) { return function(n){ return (n <= 2) ? 1 : (f(n-1) + f(n-2)); }; })(10);
ããã«ãèãã
(function(f) { return function g(m) { // ããã«åã«èãããã¨ãæãç«ã¤ã¨ return f(g)(m); // g ã¯ãä¸ã®é¢æ°ãã«ãã®ã¾ã¾å¼æ°ã渡ãã®ã§ã g ã¯ãä¸ã®é¢æ°ãã¨åããã¨ãããé¢æ°ãè¿ãã }; })(function(f) { return function(n){ return (n <= 2) ? 1 : (f(n-1) + f(n-2)); }; })(10);
ããã«ãèãã
(function(f) { // ã¯ããã®ä¸åã¯å¿ ãããã«ãå¤ã®é¢æ°ããå ¥ã£ã¦ãã return function g(m) { return f(g)(m); }; })(function(f) { return function(n){ return (n <= 2) ? 1 : (f(n-1) + f(n-2)); }; })(10);
ã¨ãããã¨ã¯ã帰ç´çã«èãã¦ããã¨
以ä¸ã®å¼ãè©ä¾¡ããã¨ãæ£ãã 10 ã®ãã£ããããæ°ãè¿ãã¨ãããã¨ã«ãªãã
(function(f) { return function g(m) { return f(g)(m); }; })(function(f) { return function(n){ return (n <= 2) ? 1 : (f(n-1) + f(n-2)); }; })(10);
ããã¼ï¼
次ã«ãé¢æ° g ã®ååãæ¶ããã¨ãèãã
ã¾ãã以ä¸ã®ããã«ãã¦ã¿ã
(function(f) { var g = function(m) { return f(g)(m); }; return g; })(function(f) { return function(n){ return (n <= 2) ? 1 : (f(n-1) + f(n-2)); }; })(10);
ããã«ãèãã
(function(f) { var g = function() { // return function(m) { // ãã£ãã® g ãç¡åã«ã㦠g ãè¿ãé¢æ°ãä½ã£ã return f(g())(m); }; } return g(); })(function(f) { return function(n){ return (n <= 2) ? 1 : (f(n-1) + f(n-2)); }; })(10);
ããã«ãèãã
(function(f) { var g = function(g) { return function(m) { return f(g(g))(m); // ããã® g ãå¼æ°ã§åãåãããã«ãã }; } return g(g); // ãã㧠g ã« g ã渡ã })(function(f) { return function(n){ return (n <= 2) ? 1 : (f(n-1) + f(n-2)); }; })(10);
ããã«ãèãã
(function(f) { return (function(g) { // g ã« g ã渡ãé¨åãäºã¤ã®åããªãã©ã«ã«ãã return function(m) { return f(g(g))(m); }; })(function(g) { return function(m) { return f(g(g))(m); }; }) })(function(f) { return function(n){ return (n <= 2) ? 1 : (f(n-1) + f(n-2)); }; })(10);
å®ã¯ãããã§Î»è¨ç®ã«ãªã£ã¦ããã
ããã¦ã
以ä¸ã®é¨åã Y ã³ã³ããã¼ã¿ã¨è¨ãããã
function(f) { return (function(g) { return function(m) { return f(g(g))(m); }; })(function(g) { return function(m) { return f(g(g))(m); }; }) }
ããã¦ã
Y ã³ã³ããã¼ã¿ã¯ãã¹ã¦ã®å帰çãªå¼ã λ è¨ç®ã«å¤æããäºãã§ãã
ãã¨ãã°
以ä¸ã®ããã«
(function(Y){ // â Y ã³ã³ããã¼ã¿ // 10 ã®ããã«ãã㨠10 ã®éä¹ãæ±ã¾ã return Y(function(fact) { return function(n) { // â ç¡åé¢æ° return (n == 1) ? 1 : (n * fact(n - 1)); // â ãªã®ã«å帰ã£ã½ã }; })(10) // ä»¥ä¸ Y ã³ã³ããã¼ã¿æ¬ä½ })(function(f) { return (function(g) { return function(m) { return f(g(g))(m); }; })(function(g) { return function(m) { return f(g(g))(m); }; }) })
ã¨ãããã㧠Y ã³ã³ããã¼ã¿ãåãå·»ãç¾è±¡ã¯ç解ãã
ãããããå¼ããã¹ã¦ λ è¨ç®ã«å¤æã§ãããã¨ããèãæ¹ãå ·ä½çã«ã©ã®ããã«å½¹ã«ãã¤ããåãããªãï¼ï¼
ã¾ã¨ã
Y ã³ã³ããã¼ã¿ãã¿ãµï¼ï¼ï¼