我已经用Haskell和C++(ideone 链接)为Project Euler's Challenge 14编写了代码。他们都记得他们之前在数组中所做的任何计算。
分别使用ghc -O2
和g++ -O3
,C++ 的运行速度比 Haskell 版本快 10-15 倍。
虽然我了解 Haskell 版本可能运行速度较慢,并且 Haskell 是一种更好的编写语言,但很高兴知道我可以对 Haskell 版本进行一些代码更改以使其运行得更快(最好在 2 倍或3 C++ 版本)?
Haskell 代码在这里:
import Data.Array
import Data.Word
import Data.List
collatz_array =
let
upperbound = 1000000
a = array (1, upperbound) [(i :: Word64, f i :: Int) | i <- [1..upperbound]]
f i = i `seq`
let
check_f i = i `seq` if i <= upperbound then a ! i else f i
in
if (i == 1) then 0 else (check_f ((if (even i) then i else 3 * i + 1) `div` 2)) + 1
in a
main =
putStrLn $ show $
foldl1' (\(x1,x2) (y1,y2) -> if (x2 >= y2) then (x1, x2) else (y1, y2)) $! (assocs collatz_array)
编辑:
我现在还使用未装箱的可变数组完成了一个版本。它仍然比 C++ 版本慢 5 倍,但有了显着的改进。代码在 ideone上。
我想知道对可变数组版本的改进,使其更接近 C++ 版本。