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)
ここで、最初の要素は計算される数値で、2 番目の数値はコラッツ シーケンスの長さです。
問題は、p14
私が行うことですwriteArray array i v
が、常にゼロ (0) の配列が含まれています。何故ですか?