jako komentarze do Twojego pytania sugerują, należy przejść przez kod w debuggera aby uzyskać dobre zrozumienie tego, co się dzieje, jeśli potrafisz postępuj zgodnie z wyjaśnieniem w książce. Ale dam ci krótki przegląd tego, co się dzieje:
To, co zostało zademonstrowane, to "memoizacja", która jest powszechną techniką optymalizacji stosowaną w programowaniu funkcjonalnym. Mówi się, że funkcja jest czysta, jeśli wynik zależy tylko od przekazanych do niej argumentów. Tak więc, jeśli funkcja jest czysta, możesz buforować wynik na podstawie argumentów - ta technika nazywana jest memoizacją. Można to zrobić, jeśli funkcja jest kosztowna do obliczenia i jest wywoływana wiele razy.
Klasyczny przykład użyty do zademonstrowania tego (jak tutaj) generuje Fibonacci numbers. Nie będę się zastanawiać nad tym, jak te są wypracowane, ale w zasadzie, gdy idziesz do coraz wyższych liczb, powtarzasz się coraz bardziej, ponieważ każda liczba jest obliczana z wcześniejszych dwóch liczb. Zapamiętując każdy wynik pośredni, trzeba je obliczyć tylko raz, co sprawia, że algorytm jest znacznie szybszy (znacznie, dużo szybciej, gdy idziesz wyżej w górę sekwencji).
W odniesieniu do tego kodu, narzędzie do zapisywania zajmuje dwa parametry - "memo", które jest pamięcią podręczną. W tym przypadku zaczyna się od pierwszych dwóch wartości już wypełnionych "[0,1]" - są to pierwsze dwie liczby Fibonacciego.
Drugi parametr to funkcja, do której zostanie zastosowana funkcja zapamiętywania. W tym przypadku funkcja rekurencyjna Fibonacci:
funkcja (powłoka, n) { powłoka powrotna (n - 1) + powłoka (n - 2); }
tj. Wynik jest sumą dwóch poprzednich liczb w sekwencji.
Pierwszy moduł do sprawdzania, czy ma już wynik w pamięci podręcznej. Jeśli to zrobi, natychmiast to zwróci. Jeśli nie, oblicza wynik i przechowuje go w pamięci podręcznej. Bez tego powtarzaliby się raz za razem i szybko osiągali niewiarygodnie powolne tempo, aby dotrzeć do wyższych liczb w sekwencji.
fibonacci (15)? – spender
Spodziewałbym się, że książka zajmie się szczegółami na temat działania tej funkcji - czy jest coś, czego w szczególności nie rozumiesz? – Douglas
Hej, niedawno nakręciłem krótki film o podstawowej pamięci za pomocą javascript - może to pomaga zrozumieć memoizer: https://www.youtube.com/watch?v=lsp82x0XdsY –