Tôi cố gắng để hiểu Haskell realization of memoization, nhưng tôi không nhận được cách thức hoạt động:Memoization với đệ quy
memoized_fib :: Int -> Integer
memoized_fib = (map fib [0..] !!)
where fib 0 = 0
fib 1 = 1
fib n = memoized_fib(n - 2) + memoized_fib(n - 1)
Trước hết tôi thậm chí còn không hiểu tại sao 'map' chức năng nhận được ba thông số (chức năng - fib, danh sách [0 ..], và ||), nhưng không phải là hai cách nó phải làm.
Cập nhật:
tôi đã cố gắng viết lại mã, nhưng có được kết quả khác nhau:
f' :: (Int -> Int) -> Int -> Int
f' mf 0 = 0
f' mf 1 = 1
f' mf n = mf(n - 2) + mf(n - 1)
f'_list :: [Int]
f'_list = map (f' faster_f') [0..]
faster_f' :: Int -> Int
faster_f' n = f'_list !! n
Tại sao? Có bất kỳ lỗi nào trong lý luận của tôi không?
họ có thể đã đưa thêm một số ngoặc đó để làm cho nó rõ ràng hơn một chút '(bản đồ fib [0 ..] !!) '==' ((bản đồ fib [0 ..]) !!) ' – soulcheck
Kết quả khác trong bản cập nhật của bạn là do tràn' Int'. Sử dụng 'Integer' để thay thế; ngoài ra nó có vẻ đúng với tôi ngay từ cái nhìn đầu tiên. – yatima2975