(lưu ý tôi đặt câu hỏi ở đây vì đó là về cơ chế khái niệm của nó, chứ không phải là vấn đề mã hóa)
Tôi đang làm việc trên một chương trình nhỏ, đó là sử dụng một chuỗi các số của Wikipedia, nhưng tôi nhận thấy rằng nếu tôi vượt qua một số nào đó, nó sẽ bị chậm một cách đau đớn, tôi loạng choạng một chút về một kỹ thuật trong Haskell được biết đến như Memoization
, họ đã cho thấy mã làm việc như thế này:
-- Traditional implementation of fibonacci, hangs after about 30
slow_fib :: Int -> Integer
slow_fib 0 = 0
slow_fib 1 = 1
slow_fib n = slow_fib (n-2) + slow_fib (n-1)
-- Memorized variant is near instant even after 10000
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)
Vì vậy, câu hỏi của tôi cho các bạn là, làm thế nào hoặc đúng hơn tại sao điều này làm việc?
Có phải vì nó bằng cách nào đó quản lý để chạy qua hầu hết danh sách trước khi tính toán bắt kịp? Nhưng nếu haskell lười biếng, thực sự không có bất kỳ tính toán nào cần theo kịp ... Vậy nó hoạt động như thế nào?
the calculation catches up
gì? BTW, ghi nhớ không đặc trưng cho haskell: en.wikipedia.org/wiki/Memoization