<br>Why fact2 is quicker than fact?!<br><br>fact2 :: Integer -> Integer<br>fact2 x = f x y<br>where<br>f n e | n < 2 = 1<br> | e == 0 = n * (n - 1)<br> | e > 0 = (f n (e `div` 2)) * (f (n - (e * 2)) (e `div` 2))<br>
y = 2 ^ (truncate (log (fromInteger x) / log 2))<br><br>fact :: Integer -> Integer<br>fact 1 = 1<br>fact n = n * fact (n - 1)<br><br>I tried to write tail-recursive fact, fact as "product [1..n]" - fact2 is quicker!<br>
<br><br>fact2 1000000 == fact 1000000 - I tested.<br>