PHP で Y コンビネータ Tomohiro wrote this on Mar 31, 2011 Y コンビネータ関数を作る PHP で Y コンビネータ [Y(F) = F(Y(F))] を行う関数 Y を定義してみる. 以下のコードは PHP 5.3+ な環境で動作する. <?php function Y($F) { return $F( function() use($F) { return call_user_func_array(Y($F), func_get_args()); } ); } Y コンビネータを使用して無名な再帰関数を作る 階乗 <?php echo Y( function($fact) { return function($x) use ($fact) { return $x == 1 ? 1 : $x * $fact($x - 1); }; })->__invoke(10); // 3628800 フィボナッチ数 <?php echo Y( function($fib) { return function($n) use ($fib) { return $n <= 2 ? 1 : $fib($n - 1) + $fib($n - 2); }; })->__invoke(10); // 55 ハノイの塔 <?php Y( function($hanoi) { return function($n, $a, $b, $c) use ($hanoi) { if ($n > 0) { $hanoi($n - 1, $a, $c, $b); echo "No. $n disk is moved from $a to $b" . PHP_EOL; $hanoi($n - 1, $c, $b, $a); } }; } )->__invoke(64, 'A', 'B', 'C'); References 不動点コンビネータ - Wikipedia Y コンビネータって何? - IT戦記