2009-10-23 72 views
1

我正在做Lychrel数字Project Euler question 55,其目的是在50次迭代中找到10,000以下的Lychrel数量。我想出了这个:Haskell中的中间列表

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] 

但我不知道如何定义xs如先前迭代时n名单,这是当n不是回文。我将如何做到这一点,其次,这将工作?

+2

与'True'无用的布尔比较。记住,'something == True' ='something'; '东西==假'=='不是东西'。当人们用* any *语言来做这件事时,我讨厌它。 – ephemient 2009-10-23 16:12:45

回答

3

如果将您的疑虑分为不同的步骤,则变得更加容易。

  1. 定义一个将数字与其相反的和相加的函数。
  2. 使用iterate重复您的号码,从x开始。
  3. 使用take将迭代次数限制为50步。
  4. 使用带谓词的all来确定这些步骤中的任何一个是否导致回文。
+0

杜,当然我的意思是“任何”而不是“全部”。基本上同样的事情,虽然;德摩根定律“任何p =或。地图p =没有。和。 map(not。p)= not。所有(不是.p)' – ephemient 2009-10-23 21:01:37

2

你需要作为一个参数传递迭代的列表(或迭代的只是数)lychrel,从answer在通话开始[]并在otherwise情况下,递归调用添加到它。查找“积累参数”以获得有关此技术的更多一般背景信息。