(function () { // Douglas Crockford's solution which makes the code // totally unreadable because of the mutual recursion function memoizer(memo, formula) { var recur = function (n) { var result = memo[n]; if (typeof result !== 'number') { result = formula(recur, n); memo[n] = result; } return result; }; return recur; } var factorial = memoizer([1, 1], function (recur, n) { return n * recur(n - 1); }); })(); (function () { // my solution function memoizer(formula) { var recur = function (n) { if (typeof formula[n] !== 'number') { formula[n] = formula(n); } return formula[n]; }; return recur; } var factorial = memoizer(function factorial(n) { if (n === 1) return n; return n * factorial(n - 1); }); })();