开发者

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.

  1. Define a function that sums a number and its reverse.
  2. Use iterate to repeat your number, starting from x.
  3. Use take to limit your iteration to 50 steps.
  4. 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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜