(หมายเหตุฉันใส่คำถามที่นี่เพราะมันเกี่ยวกับกลไกเชิงแนวคิดของมันไม่ใช่ปัญหาการเข้ารหัส)
ผมทำงานในโปรแกรมขนาดเล็กที่ใช้ลำดับของตัวเลข fibonacci ใน equasion ของมัน แต่ผมสังเกตเห็นว่าถ้าผมได้มากกว่าจำนวนหนึ่งมันก็เจ็บปวดช้า googling รอบ bit ฉัน stumbled เมื่อเทคนิคใน Haskell ที่รู้จักกันเป็น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 การบันทึกช่วยจำไม่ได้เฉพาะสำหรับ haskell: en.wikipedia.org/wiki/Memoization