Stavo leggendo Memoization with recursion che indica come per una funzione definita in modo ricorsivo fun
possiamo eseguire la memoizzazione di:
-- Memoization
memoize f = (map f [0 ..] !!)
-- Base cases
g f 0 = 0
g f 1 = 1
-- Recursive Definition
g f n = f (n-1) + f (n-2)
-- Memoized Function
gMemo = fix (memoize . g)
Quindi penso che sia qualcosa del genere:
gMemo = fix (memoize . g)
= memoize (g . gMemo)
= memoize (g . memoize (g . memoize ... memoize (g . gMemo)...))
Quindi reciterà fino a quando non troverà un valore in cui memoize
può ottenere il suo valore o un caso base, non è vero?
Ora sto cercando di definire alcune funzioni che sono interdipendenti, cioè
-- P(0) = 0, d = 170, Q(0) = 1
-- alpha(k) = (P(k) + sqrt(n)) / Q(k)
-- a(k) = floor(alpha(k))
-- P(k+1) = a(k)Q(k)-P(k)
-- Q(k+1) = (d-P^2(k+1))/Q(k)
Ora la precedente memoizzazione per g include una variabile anonima f, ma qui vorremmo funzioni specifiche.
La mia domanda è:
- Qualcuno può chiarire come funziona
gMemo
, ho ragione? - Come possiamo far funzionare qualcosa del genere per
P,Q,..
o qualcos'altro?