在解决一些学习 Haskell 的 Euler 项目问题时(因此目前我是一个完全的初学者) ,我学习了 问题12。我写了这个(天真的)解决方案:
--Get Number of Divisors of n
numDivs :: Integer -> Integer
numDivs n = toInteger $ length [ x | x<-[2.. ((n `quot` 2)+1)], n `rem` x == 0] + 2
--Generate a List of Triangular Values
triaList :: [Integer]
triaList = [foldr (+) 0 [1..n] | n <- [1..]]
--The same recursive
triaList2 = go 0 1
where go cs n = (cs+n):go (cs+n) (n+1)
--Finds the first triangular Value with more than n Divisors
sol :: Integer -> Integer
sol n = head $ filter (\x -> numDivs(x)>n) triaList2
这个 n=500
(sol 500)
的解决方案非常慢(现在运行超过2小时) ,所以我想知道如何找出这个解决方案为什么这么慢。有没有什么命令可以告诉我大部分的计算时间都花在了哪里,这样我就可以知道我的 haskell 程序哪部分是慢的?比如一个简单的侧写师。
为了说清楚,我不是要求 为了一个更快的解决方案,而是要求 一条路找到这个解决方案。如果你没有 Haskell 的知识,你会怎么开始?
我尝试编写两个 triaList
函数,但没有办法测试哪一个更快,所以这是我的问题开始。
谢谢