我正在解决欧拉计划第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
我正在GHCi中运行以下内容
maximumBy maxTuple [(collatzLength x, x) | x <- [1..1000000]]
我知道如果Haskell采用严格求值,这个程序的时间复杂度应该是O(n3)。但是由于Haskell采用惰性求值,这个程序的时间复杂度似乎应该是n的某个常数倍数。然而,这个程序已经运行了将近一个小时了,这看起来非常不合理。有没有人知道为什么会这样呢?
collatzLength
不是尾递归的。这会减慢函数的速度并导致不必要的分配。而你的maxTuple
与comparing fst
相同。 - fuz