【发布时间】:2014-06-03 23:41:19
【问题描述】:
我编写了一个简单的 Haskell 程序来解决一个难题。该算法是正确的,它为n = 40 生成了正确的结果,即 14466。但是,对于n = 100,程序变得如此缓慢,以至于我什至没有足够的耐心等待它。
我不明白它为什么这么慢,因为我希望它缓存所有中间函数调用的结果,你知道,Haskell 是一种惰性语言。
我的编译器是 GHCi 7.6.3。
我尝试过分析,但这只是告诉我 99.9% 的时间都花在了 isLoosing 函数上。
isLoosing :: Int -> Int -> Bool
isLoosing x y
| y < x = isLoosing y x
| x == 0 = True
| x == 1 = False
| y `mod` x == 0 = False
| otherwise = and [ not (isLoosing (y-x*m) x) |
m <- [1..(y `div` x)] ]
loosingSum :: Int -> Int
loosingSum n = sum [ x + y |
x <- [1..(n-1)],
y <- [(x+1)..n],
isLoosing x y == True ]
main = print $ loosingSum 40
【问题讨论】:
-
嗯,好吧,很有趣。我不明白的一件事是为什么编译器不会自动执行此操作?
-
@popovitsj GHC 从不记忆,因为如果保存 每个 函数调用,它会占用太多内存。
-
展示您的 C++ 解决方案。您可能会将苹果与橙子进行比较。
-
你可能是对的......我在我的答案中添加了 C++ 代码。
标签: performance haskell lazy-evaluation