哈斯克尔欧拉项目#24

时间:2019-02-04 08:32:23

标签: haskell

我正在尝试使用Haskell解决欧拉计画中的问题,但是我深陷Firebird's nbackup tool

我正在尝试使用阶乘来解决问题,但是对于后三位数字却无法工作,这是我的代码:

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

我只想知道为什么该算法对后三位数字无效。谢谢。

1 个答案:

答案 0 :(得分:0)

纯净的divMod对于此算法是错误的。您需要

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

相反:

recur x y arr
.......
.......
    where (d, r) = x `dvm` fact y

我们不能剩下零组合。零表示无。

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