一个数的倒数和 - Haskell

时间:2018-01-29 09:08:44

标签: haskell math functional-programming

我在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 个答案:

答案 0 :(得分:2)

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

您可以将iterate用于此目的。它的类型为:

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

换句话说,它将采用任何函数a -> a以及初始值a,并生成无限 a值列表

在您的情况下,invertedSum的类型为Integer -> Integer,您要使用的初始值(例如1999)也属于Integer类型,这一切都适合:a将是Integer

尝试使用invertedSum,例如1999 iterate take 10。请注意,这会生成无限列表,因此如果您在GHCi中进行此实验,则可能需要使用例如 model mvclearn.Models.Employee @{ ViewBag.Title = "menu"; } @{ Layout = null; } <link href="~/Content/bootstrap.css" rel="stylesheet" /> <style> .error { color: red; } </style> <div class="container"> <div class="container"style="width:30%"> @using (Html.BeginForm("save", "Test", FormMethod.Post)) { @Html.DropDownListFor(m => m.Service_Code, Model.ser_code, "--select--", new { @class = "form-control", @placeholder = "Enter Service code" }) @Html.ValidationMessageFor(m => m.Service_Code, "", new { @class = "error" }) @Html.TextBoxFor(m => m.Service_Name, new { @class = "form-control", @placeholder = "Service Name" }) @Html.ValidationMessageFor(m => m.Service_Name, "", new { @class = "error" }) <input type="submit" value="submit" class="btn-block" /> } 限制生成的值的数量。