2012-02-10 7 views
1

私はハスケルの知識を増やそうと試みて、私は12番目のプロジェクトオイラー問題をState Monadを使って解決しようとしていると思っていました。三角形の数字の作成全体を状態に入れて組み込むことは当時私には意味があるようでした。プロジェクトオイラー12とハスケルの状態モナド

は、ここに私のコードです:

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

ループ状態が逆になっているようです。あなたは少なくとも500の除数を持つ三角形の数を見つけた場合にのみ再帰しますので、最初のものがそれよりも少ないので、もちろん直ちに停止します。

これを修正するには、if divs >= 500の行をif divs < 500に変更します。

これを済ませたら、除数の数ではなく数値そのものを返すことになっているので、return divsも修正する必要があります。私はあなたにその部分を固定しておきます。

+0

うわー、私はとてもうまくいきませんでしたので、私は単純なものを完全に逃しました。それを指摘してくれてありがとう。私は今働いている。 – Bryce

関連する問題