Nell'attribuzione dell'esercizio corrente del corso di Programmazione funzionale che sto facendo, dobbiamo creare una versione memoizzata di una determinata funzione. Per spiegare Memoizzazione, il seguente esempio è dato:Come funziona questa funzione fibonacci memoizzata?
fiblist = [ fibm x | x <- [0..]]
fibm 0 = 0
fibm 1 = 1
fibm n = fiblist !! (n-1) + fiblist !! (n-2)
Ma io non comprendere appieno come funziona.
Chiamiamo fibm 3
.
fibm 3
--> fiblist !! 2 + fibList 1
--> [fibm 0, fibm 1, fibm 2] !! 2 + [fibm 0, fibm 1] !! 1
--> fibm 2 + fibm 1
--> (fiblist !! 1 + fiblist 0) + 1
--> ([fibm 0, fibm 1] !! 1 + [fibm 0] !! 0) + 1
--> (fibm 1 + fibm 0) + 1
--> 1 + 0 + 1
--> 2
Da altre domande/risposte e googling ho imparato che in qualche modo, il fiblist valutato è condivisa tra le chiamate.
Ciò significa che, ad esempio, per fiblist !! 2 + fiblist !! 1
, i valori di elenco vengono calcolati una sola volta per fiblist !! 2
e quindi vengono riutilizzati per fiblist !! 1
?
Quindi i due numeri di Fibonacci vengono calcolati solo una volta per chiamata, quindi nessun numero esponenziale di chiamate. Ma per quanto riguarda i livelli "inferiori" della chiamata nella funzione fiblist
? In che modo beneficiano del calcolato fiblist
nella chiamata originale fibm
?
Una domanda correlata, che ha sicuramente già avuto risposta su S.O. - guardando in questo momento - riguarda la valutazione pigra. Si consideri '' if (f x)> 0 then f x else 0'' dove '' f x'' è una chiamata di funzione costosa. Sarà '' f x'' ricalcolato se la condizione if è vera, o il valore sarà semplicemente riutilizzato? – user42179
Per quanto riguarda la domanda correlata [vedi questo] (http://stackoverflow.com/q/15084162/485115). –
Ah, eccolo. Grazie! – user42179