项目欧拉#24在Haskell

问题描述 投票:1回答:1

我试图解决使用哈斯克尔从项目欧拉的问题,但我得到了在#24

我试图用阶乘来解决问题,但就是不能在最后三位的工作,这里是我的代码:

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。

我只是想知道为什么这种算法没有最后三位工作。谢谢。

haskell
1个回答
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)没有要做出更多的选择,我们只是使用了最后一个可用的数字左侧。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.