Reputation: 8809
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"
| ((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?
Upvotes: 1
Views: 311
Reputation: 204808
It becomes much easier if you separate your concerns into distinct steps.
iterate
to repeat your number, starting from x
.take
to limit your iteration to 50 steps.all
with a predicate to determine if any of these steps results in a palindrome.Upvotes: 3
Reputation: 29100
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.
Upvotes: 2