相关疑难解决方法(0)

为什么这个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的一些常数倍.这已经运行了近一个小时了.似乎很不合理.有谁知道为什么?

optimization haskell

9
推荐指数
1
解决办法
769
查看次数

Haskell空间溢出

我编译了这个程序,并试图运行它.

import Data.List
import Data.Ord
import qualified Data.MemoCombinators as Memo

collatzLength :: Int -> Int
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 $ maximumBy (comparing fst) $ [(collatzLength n, n) | n <- [1..1000000]]
Run Code Online (Sandbox Code Playgroud)

我从GHC获得以下内容

Stack space overflow: current size 8388608 bytes.
Use `+RTS -Ksize -RTS' to increase it. …
Run Code Online (Sandbox Code Playgroud)

haskell ghc

9
推荐指数
3
解决办法
2943
查看次数

标签 统计

haskell ×2

ghc ×1

optimization ×1