项目Euler#24在Haskell

Project Euler #24 in Haskell

我正试图用Haskell解决Project Euler的问题,但我在24时被吸引了。

我试图用阶乘来解决这个问题,但最后三位数字不起作用,下面是我的代码:

1
2
3
4
5
6
7
8
9
10
11
import Data.List
fact n = product [n, n-1 .. 1]
recur :: Int -> Int -> [Int] -> [Int]
recur x y arr
    | y > 1     = arr !! d : recur r (y-1) (delete (arr !! d) arr)
    | otherwise = arr
    where d = x `div` fact y
          r = x `mod` fact y

main::IO()
main = print(recur 1000000 9 [0..9])

(我知道它现在不是真正的"功能性的")。我设法得到了结果[2,7,8,3,9,1,4,5,0,6],而我无意中得出的正确答案是2783915460。

我只想知道为什么这个算法在最后三位数不起作用。谢谢。


对于该算法,未经修正的divMod是错误的。你需要

1
2
3
4
dvm x facty | r == 0    = (d-1, facty)
            | otherwise = (d, r)
                  where
                  (d, r) = divMod x facty

相反:

1
2
3
4
recur x y arr
.......
.......
    where (d, r) = x `dvm` fact y

我们不能有零个组合来向左。零表示无。

另外,模式保护条件也应更改为y > 0。只有当剩余选项列表的长度为1(此时,y为0)时,才没有其他选项可供选择,我们只使用剩下的最后一个可用数字。