Если вы используете язык с первоклассными функциями, такими как Scheme, вы можете добавить памятку без изменения исходного алгоритма:
(define (memoize fn)
(letrec ((get (lambda (query) '(#f)))
(set (lambda (query value)
(let ((old-get get))
(set! get (lambda (q)
(if (equal? q query)
(cons #t value)
(old-get q))))))))
(lambda args
(let ((val (get args)))
(if (car val)
(cdr val)
(let ((ret (apply fn args)))
(set args ret)
ret))))))
(define fib (memoize (lambda (x)
(if (< x 2) x
(+ (fib (- x 1)) (fib (- x 2)))))))
Первый блок обеспечивает средство запоминания, а второй блок представляет собой последовательность Фибоначчи, использующую это средство. Теперь он имеет время выполнения O (n) (в отличие от O (2 ^ n) для алгоритма без запоминания).
Примечание: предоставленное средство запоминания использует цепочку замыканий для поиска предыдущих вызовов. В худшем случае это может быть O (n). В этом случае, однако, требуемые значения всегда находятся наверху цепочки, обеспечивая поиск O (1).