(নোট আমি প্রশ্নটি এখানে রাখছি কারণ এটি কোডিং সমস্যার পরিবর্তে এটির ধারণাগত মেকানিক্স সম্পর্কে)
আমি একটি ছোট প্রোগ্রামে কাজ করছিলাম, এটি তার সমীকরণে ফিবোনাচি সংখ্যাগুলির ক্রম ব্যবহার করছিলাম, তবে আমি লক্ষ্য করেছি যে আমি যদি একটি নির্দিষ্ট সংখ্যার উপরে পৌঁছে যাই তবে এটি বেদনাদায়কভাবে ধীর হয়ে উঠেছে, কিছুটা প্রায় গুগল করে আমি হাস্কেল নামে পরিচিত একটি প্রযুক্তিতে হোঁচট খেয়েছি Memoization
, তারা কোডগুলি এভাবে কাজ করে দেখিয়েছিল:
-- 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)
সুতরাং আপনাদের কাছে আমার প্রশ্নটি হল, কিভাবে বা বরং কেন এই কাজ করে?
এটি কি কারণ এটি কোনওভাবে হিসাব শুরুর আগে বেশিরভাগ তালিকার মধ্যে দিয়ে চালানো পরিচালনা করে? তবে হ্যাশেল যদি অলস হয় তবে সত্যিই এমন কোনও গণনা নেই যা ধরতে হবে ... সুতরাং এটি কীভাবে কাজ করবে?
the calculation catches up
। : BTW, memoization না নির্দিষ্ট Haskell হয় en.wikipedia.org/wiki/Memoization