在閱讀了幾個來源后,我想出了以下memo功能,用于在 Haskell 中使用“廣義遞回”進行記憶。但它不起作用。為什么?!
fib f 0 = 1
fib f 1 = 1
fib f n = fib f (n - 1) fib f (n - 2)
memo f n = fList !! n
where fList = map (f (fList !!)) [0..]
沒有記憶的遞回運行
λ> fix fib 30
1346269
(1.65 secs, 962,135,992 bytes)
它需要與“記憶”版本相同的時間:
λ> memo fib 30
1346269
(1.62 secs, 962,141,192 bytes)
但是,以下作業:
fibMemoDirect n = fibList !! n
where fibList = map fib [0..]
fib 0 = 1
fib 1 = 1
fib n = fibList !! (n - 1) fibList !! (n - 2)
λ> fibMemoDirect 30
1346269
(0.01 secs, 93,728 bytes)
為什么memo fib上面的作業沒有fibMemoDirect給定的都使用 CAF那樣快?
資料來源:
- 哈斯克爾維基
- Edward Kmett 的Stackoverflow 答案
uj5u.com熱心網友回復:
你幾乎已經明白了,但你的第三行需要是
fib f n = f (n-1) f (n-2)
...或者你甚至不使用f,只是撰寫一個普通的、遞回的、指數斐波那契函式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/366333.html
