Jon*_*FTW 1 constructor haskell
chain n | n `elem` xs = length xs
| otherwise = (chain (sumFac n)) : xs
fac n = foldl (*) 1 $ enumFromTo 1 n
sumFac n = sum $ map fac $ decToList n
Run Code Online (Sandbox Code Playgroud)
除了我不知道构造列表的正确语法,chain n以便它建立一个列表xs然后返回xs一个数字再次出现在列表中xs并开始循环的长度.
我如何纠正我的链功能以使其工作?
使用辅助函数:
chain n = go [n]
where go xs | next `elem` xs = reverse $ next : xs
| otherwise = go (next:xs)
where next = sumFac $ head xs
fac = product . enumFromTo 1
sumFac = sum . map fac . map digitToInt . show
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,你接近你想要的东西,但你把两者模糊在一起.
为了好玩,我扔了无点的fac和sumFac.
这是一个使用视图模式的无点定义(但是,唉,似乎发痒#2395):
{-# LANGUAGE ViewPatterns #-}
chain = head . filter hasDup . tail . inits . iterate sumFac
where hasDup (reverse -> (x:xs)) = x `elem` xs
Run Code Online (Sandbox Code Playgroud)