我想了解Haskell realization of memoization,但我不明白它是如何工作:記憶化遞歸
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)
首先我甚至不明白爲什麼「map'功能得到三個參數(函數 - 纖維,列表[0 ..]和||),但不是兩個它必須做的。
更新時間:
我試圖重寫代碼,但得到了不同的結果:
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
爲什麼?我的推理中是否有任何錯誤?
他們可能已經把一些額外的括號存在,使其更有點明顯'(圖fib [0 ..] !!)'=='((map fib [0 ..])!!)' – soulcheck 2012-02-23 09:48:13
更新中的不同結果是由於'Int'溢出。改用'Integer';除此之外,乍一看似乎是對的。 – yatima2975 2012-02-23 11:58:00