<?php
function memoize($f) {
$memo = [1 => 1];
return function ($x) use ($f, &$memo) {
if (array_key_exists($x, $memo)) {
return $memo[$x];
}
$r = $f($x);
$memo[$x] = $r;
return $r;
};
}
function fibonacci(int $x) {
if ($x <= 2) {
return 1;
}
return fibonacci($x - 1) + fibonacci($x - 2);
}
$memFibonacci = memoize('fibonacci');
for ($i = 1; $i <= 2; $i++) {
$start = strtotime("now");
$f37 = $memFibonacci(37);
$seconds = strtotime("now") - $start;
echo "$i: f37 is $f37\n";
echo "$i: seconds is $seconds\n";
}
// prints:
// 1: f37 is 24157817
// 1: seconds is 1
// 2: f37 is 24157817
// 2: seconds is 0
$start = strtotime("now");
$f38 = $memFibonacci(38);
$seconds = strtotime("now") - $start;
echo "f38 is $f38\n";
echo "seconds is $seconds";
// f38 is 39088169
// seconds is 2
| This memoization method works well with non-recursive functions. Because it only remembers the result of the first function call. |