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

一个数的倒数和——Haskell

  •  -1
  • user9183739  · 技术社区  · 7 年前

    我在Haskell中具有以下功能:

    invertedSum :: Integer -> Integer
    invertedSum n = n + (read . reverse . show) n
    

    我需要知道为了使这个数字成为capicua,必须做的总数。也就是说,

    invertedSum 1999 = 11990   (1999+9991)
    invertedSum 11990 = 21901 
    invertedSum 21901 = 32813
    invertedSum 32813 = 64636
    invertedSum 64636 = 128282
    invertedSum 128282 = 411103
    invertedSum 411103 = 712217
    
    isCapicua :: Integer -> Bool
    isCapicua n | show n == (reverse . show) n   = True
                | otherwise                      = False
    
    isCapicua 712217 == True
    

    所以,我想生成以下列表,但我不知道如何生成。

    sumUpToCapicua 1999 = [11990, 21901, 32813, 64636, 128282, 411103, 712217]
    

    genericLength (sumUpToCapicua 1000000079994144385) == 259

    1 回复  |  直到 7 年前
        1
  •  2
  •   Mark Seemann    7 年前

    您已经有了一个函数 invertedSum 使用类型 Integer -> Integer . 如果我正确理解了这个问题,您可以多次应用它,从特定的 Integer (例如。 1999 ).

    你可以使用 iterate 为此目的。其类型为:

    Prelude> :t iterate
    iterate :: (a -> a) -> a -> [a]
    

    换言之,它将具有任何功能 a -> a ,以及初始值 a ,并生成 极大的 列表(共个) 价值观

    就你而言, 反相器 具有类型 整数->整数 ,以及要使用的初始值(例如。 1999 )也属于 整数 ,因此它非常适合: 可能是 整数 .

    尝试使用 反相器 和例如。 1999 具有 迭代 . 请注意,这会产生 极大的 因此,如果您在GHCi中尝试此功能,您可能希望使用例如。 take 10 限制生成的值的数量。

    推荐文章