Lambda expressions

<?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.