Rekurencja z cache'owaniem (plik recur.js)

Ćwiczenie 8.5:

Napisz funkcję cached(cache, fun), która tworzy cache'owaną wersję rekurencyjnej funkcji fun. Pierwszym argumentem funkcji jest tablica cache, zawierająca kilka początkowych wartości funkcji. Drugim argumentem jest definicja funkcji rekurencyjnej fun. Przy obliczeniu funkcja cache'owana powinna pobrać wartość z cache'a. Jeżeli w cahce'u danej wartości brak, to wówczas trzeba skorzystać z definicji funkcji fun, oraz zapamiętać obliczoną wartość w cache'u.

Przykładowo,

  •  var fibonacci = cached([0, 1], function (recur, n) {
        return recur(n - 1) + recur(n - 2);
    });
    
    powinno obliczać liczby Fibonacciego.
  • var factorial = cached([1], function (recur, n) {
        return recur(n - 1) *n;
    });
    
    powinno obliczać silnię.

W szczególności,

console.log(fibonacci(5));

wyświetli 5