项目Euler 12与Haskell的State Monad

时间:2012-02-10 03:37:11

标签: haskell state

在尝试增加我的Haskell知识时,我想我会尝试使用State Monad解决第12项Euler问题。当时我把整个三角形数字创建与状态结合起来似乎是有意义的。

这是我的代码:

module Main where

import Control.Monad
import Control.Monad.State

type MyState = (Integer, Integer)
s0 = (7, 28)

tick :: State MyState Int
tick = do 
    (n,o) <- get
    let divs = getDivLen (n,o)
    if divs >= 500
        then do
            let n' = n + 1
            let o' = o + n'
            put (n', o')
            tick
        else
            return divs

getDivLen :: MyState -> Int
getDivLen (n,o) = foldl1 (+) [2 | x <- [1..x], o `mod` x == 0]
    where x = round . sqrt $ fromIntegral o

main :: IO ()
main = print $ evalState tick s0

代码编译,我得到结果6到控制台。我只是不确定我做错了没有递归发生。

提前致谢。

1 个答案:

答案 0 :(得分:1)

看起来你的循环条件倒退了。如果你找到一个至少有500个除数的三角形数字,你只会递归,所以它会立即停止,因为第一个除数小于此数。

要解决此问题,请将行if divs >= 500更改为if divs < 500

一旦你完成了这个,你应该返回数字本身,而不是除数的数量,所以你也必须修复return divs。我会把那个部分留给你。

相关问题