Memoizacja to technika optymalizacji wydajności polegająca na zapamiętywaniu wyników wywołań funkcji, aby przy kolejnych wywołaniach z tymi samymi argumentami aby nie trzeba było wykonywać ponownie obliczeń, a zamiast tego zwracać wynik z pamięci (cache). Jest to szczególnie użyteczne w przypadku kosztownych obliczeniowo operacji oraz funkcji rekurencyjnych, takich jak obliczanie ciągów Fibonacciego.
Przykład memoizacji w JavaScript
Zobaczmy, jak możemy zaimplementować memoizację w JavaScript na przykładzie funkcji obliczającej n-ty element ciągu Fibonacciego:
// Funkcja obliczająca n-ty element ciągu Fibonacciego z memoizacją
function fibonacci(n, memo = {}) {
if (n in memo) return memo[n];
if (n <= 2) return 1;
memo[n] = fibonacci(n - 1, memo) + fibonacci(n - 2, memo);
return memo[n];
}
HTML
Aby zademonstrować użycie memoizacji, stwórzmy prosty interfejs użytkownika, który pozwoli użytkownikowi na obliczenie n-tego elementu ciągu Fibonacciego:
<!DOCTYPE html>
<html>
<head>
<title>Memoizacja w JavaScript</title>
</head>
<body>
<label for="number">Wpisz numer elementu ciągu Fibonacciego:</label>
<input type="number" id="fibNumber">
<button onclick="calculateFib()">Oblicz</button>
<p>Wynik: <span id="result"></span></p>
<script>
// Funkcja wywoływana po kliknięciu przycisku
function calculateFib() {
const n = document.getElementById("fibNumber").value;
const result = fibonacci(parseInt(n));
document.getElementById("result").innerText = result;
}
</script>
</body>
</html>
Podsumowanie
Memoizacja w JavaScript jest potężną techniką optymalizacji, która może znacząco przyspieszyć wykonywanie programów poprzez zmniejszenie liczby obliczeń potrzebnych do uzyskania wyniku. Wykorzystanie pamięci cache do przechowywania wyników obliczeń i unikanie powtarzania tych samych operacji pozwala na oszczędność zasobów i czasu, co jest szczególnie ważne w przypadku operacji o wysokiej złożoności obliczeniowej. Implementacja memoizacji jest stosunkowo prosta, ale może przynieść znaczące korzyści w różnorodnych scenariuszach programistycznych, zwłaszcza przy pracy z ciężkimi obliczeniami i algorytmami rekurencyjnymi.