代码之家  ›  专栏  ›  技术社区  ›  Jonno_FTW

Haskell中的中间列表

  •  1
  • Jonno_FTW  · 技术社区  · 17 年前

    我正在做 Project Euler question 55 在Lychrel数上,目标是在50次迭代中找到低于10000的Lychrel数。我想到了这个:

    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 回复  |  直到 11 年前
        1
  •  3
  •   ephemient    17 年前

    如果将您的关注点分为不同的步骤,就会变得容易得多。

    1. 定义一个求和一个数并求反的函数。
    2. 使用 iterate 重复你的号码,从开始 x .
    3. 使用 take 将迭代限制为50个步骤。
    4. 使用 all 用一个谓词来确定这些步骤中是否有一个会导致回文。
        2
  •  2
  •   Ganesh Sittampalam    17 年前

    您需要将迭代列表(或只是迭代次数)作为参数传递给 lychrel 开始 [] 在呼叫中来自 answer 并在递归调用中添加到 otherwise 案例。有关此技术的更一般背景,请查看“累积参数”。

    推荐文章