Мемоизация в программировании

Мемоизация — это обычное кеширование для функций и оптимизации каких-нибудь вычислений или других операций. Является частью так называемого «динамического программирования». Рассмотрим абстрактный пример с рекурсивной фибоначи на javascript:

// Обычный пример без мемоизации
function fibonacci(n) {
  if (n <= 1) {
    return 1;
  }

  a = fibonacci(n - 1);
  b = fibonacci(n - 2);
  
  return a + b;
}

// С мемоизацией
function fibonacciMemo(element, memo = {}) {
  if (element < 3) return 1;
  if (element in memo) return memo[element];

  memo[element] = fibonacciMemo(element - 1, memo) + fibonacciMemo(element - 2, memo);

  return memo[element];
}

// С замыканием переменной для мемоизации
function fibonacciMemo(n) {
  const memorize = {};

  function fibonacci(n) {
    if (n in memorize) return memorize[n];
    if (n < 3) return 1;
    return memorize[n] = fibonacci(n - 1) + fibonacci(n - 2);
  }

  return fibonacci(n);
}

Мемоизация может быть и без рекурсии, и вполне в реальных задачах — где здесь и сейчас надо кешировать информацию.

Читайте также
Опубликовали релиз OpenSSH 9.5
Опубликовали релиз OpenSSH 9.5
Опубликовали релиз OpenSSH 9.5

OpenSSH — это 100% реализация протокола SSH 2.0. которая включает поддержку sftp-клиента и сервера.

SolidStart, новости последних обновлений
SolidStart, новости последних обновлений
SolidStart, новости последних обновлений

В последнее время вышло две минорных версии 0.5.0 и 0.6.0 SolidStart. Библиотека идет к версии 1.0 и выпускает много полезных фич.

15 сайтов, чтобы сэкономить время CSS-разработчику
15 сайтов, чтобы сэкономить время CSS-разработчику
15 сайтов, чтобы сэкономить время CSS-разработчику

Собрали 15 сайтов, которые помогут сэкономить много времени и расширить опыт разработки CSS.

Tailwind V4: масштабные изменения
Tailwind V4: масштабные изменения
Tailwind V4: масштабные изменения

В прошлом году на Tailwind Connect команда представила краткий обзор Oxide — нового высокопроизводительного движка для Tailwind CSS. Он разработан для упрощения работы разработчиков и использования последних возможностей веб-платформы.