我试图解决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; ...
你可以帮帮我吗?感谢,
奥利弗
编辑: 好的,我找到了如何制作它:我测试列表是否包含给定数量的元素,通过删除这些元素数量,并检查剩余的列表是否为空。
答案 0 :(得分:2)
您的问题是liste 370
会产生一个无限列表,而您正试图在longeur
中获取它的长度:
longeur i =
let ...
laliste = liste i
...
in if (length laliste < maxRecherche)
...
很可能该进程因内存不足而终止。