在尝试增加我的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到控制台。我只是不确定我做错了没有递归发生。
提前致谢。
答案 0 :(得分:1)
看起来你的循环条件倒退了。如果你找到一个至少有500个除数的三角形数字,你只会递归,所以它会立即停止,因为第一个除数小于此数。
要解决此问题,请将行if divs >= 500
更改为if divs < 500
。
一旦你完成了这个,你应该返回数字本身,而不是除数的数量,所以你也必须修复return divs
。我会把那个部分留给你。