Haskell的第26个Euler项目:"流程已停止"

时间:2015-11-14 13:17:59

标签: haskell

我试图解决26th project Euler problem并且我写了一些编译好的东西,但是当我启动它时我得到了一个错误。

该计划是:

module Main where

import Data.List (maximumBy, unfoldr)

liste :: Int -> [(Int,Int)]
liste i = unfoldr étape (1,i)
  where étape (n,m) = if mod (n*10) m == 0 
                      then Nothing 
                      else Just ((mod (n*10) m, div (n*10) m), (mod (n*10) m, i))

longueur :: Int -> Maybe Int
longueur i =
  let maxRecherche = 5000
      laListe = liste i
      assignAttribute :: Int -> Maybe Int
      assignAttribute j = if ((laListe !! j) == (laListe !! maxRecherche)) 
                          then Just (maxRecherche - j)
                          else if (j==1) then Nothing
                               else assignAttribute(j-1)
  in if (length laListe < maxRecherche)
     then Nothing
     else assignAttribute(maxRecherche-1) 
                          -- éléments comparés à maxRacherche, dv dc etre avant (a=a)
main :: IO()
main = do
  putStrLn "hello"
  let longueur370 = longueur 370
  putStrLn $ "370 : " ++ show longueur370
  let longueurs = Data.List.maximumBy tri $ map (\i -> (i,longueur i)) [1..1000]
  putStrLn $ "resultats : " ++ (show longueurs)
    where tri (_,Nothing)(_,Nothing) = EQ
          tri (_,Nothing)(_,_) = LT
          tri (_,_)(_,Nothing) = GT
          tri (_,Just u)(_,Just v) = compare u v

以下是一些简短的解释:

  • 函数liste创建一个无限的对列表,一对包含(rest,digit),其中rest和digit是计算1 / n的第i个数字的结果(参见项目euler为什么我计算1 / n) 这个功能似乎运行良好,正如370的测试所证明的那样。
  • 函数longueur提取5000个第一对并尝试查找任何循环的长度。我假设第5000对包含在一个可能的循环中,即循环已经开始。请注意,它完全是经验性的,但计算的1 / n限制为[1..1000],这不是很大。 最后,由于如果没有循环,对列表可以停止,这一切都有点复杂。

操作系统给出错误:几分钟后,我收到消息&#34; processus停止&#34; ...

你可以帮帮我吗?

感谢,

奥利弗

编辑: 好的,我找到了如何制作它:我测试列表是否包含给定数量的元素,通过删除这些元素数量,并检查剩余的列表是否为空。

1 个答案:

答案 0 :(得分:2)

您的问题是liste 370会产生一个无限列表,而您正试图在longeur中获取它的长度:

longeur i =
  let ...
      laliste = liste i
      ...
  in if (length laliste < maxRecherche)
       ...

很可能该进程因内存不足而终止。