(perhatikan saya mengajukan pertanyaan di sini karena ini tentang mekanisme konseptualnya, daripada masalah pengkodean)
Saya sedang mengerjakan sebuah program kecil, yang menggunakan urutan angka-angka fibonacci dalam persamaannya, tetapi saya perhatikan bahwa jika saya mendapatkan lebih dari jumlah tertentu ia menjadi sangat lambat, mencari-cari sedikit, saya menemukan sebuah teknik di Haskell yang dikenal sebagai Memoization
, mereka menunjukkan kode berfungsi seperti ini:
-- 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)
Jadi pertanyaan saya kepada kalian adalah, bagaimana atau lebih tepatnya mengapa ini bekerja?
Apakah karena entah bagaimana berhasil melewati sebagian besar daftar sebelum perhitungannya tercapai? Tetapi jika haskell malas, sebenarnya tidak ada perhitungan yang perlu mengejar ... Jadi bagaimana cara kerjanya?
the calculation catches up
? BTW, memoisasi tidak khusus untuk haskell: en.wikipedia.org/wiki/Memoization