【问题标题】:Intermediate lists in HaskellHaskell 中的中间列表
【发布时间】:2023-04-05 04:47:05
【问题描述】:

我正在对 Lychrel 数执行 Project Euler question 55,其目的是在 50 次迭代中找到低于 10,000 的 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 不是回文。我将如何做到这一点,其次这会起作用吗?

【问题讨论】:

  • True 进行无用的布尔比较。记住,something == True = something; something == False == not something。我讨厌人们用任何语言这样做。

标签: list haskell syntax


【解决方案1】:

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

  1. 定义一个对数字求和的函数。
  2. 使用iterate 重复您的号码,从x 开始。
  3. 使用 take 将迭代限制为 50 步。
  4. all 与谓词一起使用,以确定这些步骤中的任何一个是否会导致回文。

【讨论】:

  • 呃,当然我的意思是any 不是all。不过,基本上是一样的;德摩根定律any p = or . map p = not . and . map (not . p) = not . all (not . p)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2019-02-27
    • 1970-01-01
    相关资源
    最近更新 更多