Intermediate lists in Haskell
I am doing Project Euler question 55 on Lychrel numbers where the aim is to find the number of Lychrel numbers below 10,000 within 50 iterations. I came up with this:
revAdd n = (read $ reverse $ show n) + n
lychrel n | length xs == 50 = error "False开发者_C百科"
| ((reverse $ show (revAdd n)) == (show (revAdd n))) = True
| otherwise = (lychrel (revadd n) ) : xs
answer = length [ x | x <- [1..10000] , lychrel x == True]
But I don't know how to define xs
as the list of previous iterations upon n
, which are when n
is not a palindrome. How would I do this, and secondly would this work?
It becomes much easier if you separate your concerns into distinct steps.
- Define a function that sums a number and its reverse.
- Use
iterate
to repeat your number, starting fromx
. - Use
take
to limit your iteration to 50 steps. - Use
all
with a predicate to determine if any of these steps results in a palindrome.
You need to pass the list of iterations (or just the number of iterations) in as a parameter to lychrel
, starting with []
in the call from answer
and adding to it in the recursive call in the otherwise
case. Look up "accumulating parameters" for more general background on this technique.
精彩评论