我是Haskell的新手,爲了更好地學習它,我開始在這裏和那裏解決問題,最後我得到了這個結果(project Euler 34)。Haskell性能調優
145是一個奇怪的數字,爲1! + 4! + 5! = 1 + 24 + 120 = 145.
找到所有數字的總和,它們等於它們的位數的階乘>之和。
注意:如1! = 1和2! = 2不是它們不包括在內的總和。
我寫了一個C和一個Haskell蠻力解決方案。
有人能解釋我的Haskell版本比C實現慢15x(〜0.450s vs 6.5s),以及如何調整和加速Haskell解決方案?
unsigned int solve(){
unsigned int result = 0;
unsigned int i=10;
while(i<2540161){
unsigned int sumOfFacts = 0;
unsigned int number = i;
while (number > 0) {
unsigned int d = number % 10;
number /= 10;
sumOfFacts += factorial(d);
}
if (sumOfFacts == i)
result += i;
i++;
}
return result;
}
這裏的哈斯克爾解決方案
--BRUTE FORCE SOLUTION
solve:: Int
solve = sum (filter (\x-> sfc x 0 == x) [10..2540160])
--sum factorial of digits
sfc :: Int -> Int -> Int
sfc 0 acc = acc
sfc n acc = sfc n' (acc+fc r)
where
n' = div n 10
r = mod n 10 --n-(10*n')
fc 0 =1
fc 1 =1
fc 2 =2
fc 3 =6
fc 4 =24
fc 5 =120
fc 6 =720
fc 7 =5040
fc 8 =40320
fc 9 =362880
你用'-O'編譯了Haskell版本嗎? – 2015-04-02 13:23:00
用'-O2'編譯的非常類似的程序在我的電腦上運行0.55s – Carsten 2015-04-02 13:27:39
基本上與您的版本(0.54s)相同 – Carsten 2015-04-02 13:28:34