PHP で Y コンビネータ
Tomohiro wrote this on Mar 31, 2011Y コンビネータ関数を作る
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');