我正在解决Project Euler 的问题,我在14号。
我有一个可变IOArray
的来存储我已经计算过的 Collatz 长度:
import Data.Array.IO
import Control.Monad
import Data.Array
p14 :: IO [Int]
p14 = do
array <- p14extra
forM_ [1..1000000] $ \i -> do
e <- readArray array i
if e == 0
then do
let col = collatz i
forM_ col $ \(v,i) -> do
writeArray array i v
else return ()
frozen <- freeze array
return $ elems frozen
-- an `IOArray` from `1` to `1000000` full of `0`
p14extra :: IO (IOArray Int Int)
p14extra = newArray (1,1000000) 0
collatz :: Int -> [(Int, Int)]
collatz n
| n == 1 = [(1,1)]
| otherwise = (n, (snd $ head hack) + 1) : hack
where
hack = collatz $ if even n then (n `div` 2) else (3 * n + 1)
其中第一个元素是正在计算的数字,第二个数字是其 Collatz 序列的长度。
问题是,在p14
我做writeArray array i v
,但它总是有一个零(0)数组。这是为什么?