Jos*_*sto 9 optimization haskell
我正在研究Project Euler Problem 14.这是我的解决方案.
import Data.List
collatzLength :: Int->Int
collatzLength 1 = 1
collatzLength n | odd n = 1 + collatzLength (3 * n + 1)
| even n = 1 + collatzLength (n `quot` 2)
maxTuple :: (Int, Int)->(Int, Int)->Ordering
maxTuple (x1, x2) (y1, y2) | x1 > y1 = GT
| x1 < y1 = LT
| otherwise = EQ
Run Code Online (Sandbox Code Playgroud)
我正在运行以下GHCi
maximumBy maxTuple [(collatzLength x, x) | x <- [1..1000000]]
Run Code Online (Sandbox Code Playgroud)
我知道如果Haskell严格评估,那么这个时间就像O(n 3).由于Haskell懒惰地评估,看起来这应该是n的一些常数倍.这已经运行了近一个小时了.似乎很不合理.有谁知道为什么?
ham*_*mar 22
您假设该collatzLength函数将被记忆.Haskell不进行自动记忆.你需要自己做.这是使用data-memocombinators包的示例.
import Data.List
import Data.Ord
import qualified Data.MemoCombinators as Memo
collatzLength :: Integer -> Integer
collatzLength = Memo.arrayRange (1,1000000) collatzLength'
where
collatzLength' 1 = 1
collatzLength' n | odd n = 1 + collatzLength (3 * n + 1)
| even n = 1 + collatzLength (n `quot` 2)
main = print $ foldl1' max $ [(collatzLength n, n) | n <- [1..1000000]]
Run Code Online (Sandbox Code Playgroud)
编译后,这将在大约1秒内运行-O2.
| 归档时间: |
|
| 查看次数: |
769 次 |
| 最近记录: |