Haskell程序显示两个区间之间的阿姆斯特朗数


在Haskell中,我们可以使用用户定义的函数和递归。在第一个示例中,我们将使用(用户定义的,isArmstrong和armstrongInRange)函数,在第二个示例中,我们将使用具有基例和递归情况的递归。

算法

  • 步骤1 - 定义用户定义的isArmstrong函数

  • 步骤2 - 程序执行将从main函数开始。main()函数控制整个程序。它被写成main = do。

  • 步骤3 - 初始化名为“lower”和“upper”的变量。它将保存要打印阿姆斯特朗数的范围。

  • 步骤4 - 在调用函数后,使用'print'函数将定义范围内的结果阿姆斯特朗数打印到控制台。

示例1

在这个例子中,我们将看到如何使用用户定义的函数在两个区间之间显示阿姆斯特朗数。

isArmstrong :: Integer -> Bool
isArmstrong n = n == sum (map (^ len) digits)
   where
      digits = map (\x -> read [x] :: Integer) (show n)
      len = length digits

armstrongInRange :: Integer -> Integer -> [Integer]
armstrongInRange a b = [x | x <- [a..b], isArmstrong x]

main :: IO ()
main = do
        let lower = 100
            upper = 1000
        print (armstrongInRange lower upper)

输出

[153,370,371,407]

示例2

在这个例子中,我们将看到如何使用用户定义的函数(使用filter函数)在两个区间之间显示阿姆斯特朗数。

import Data.List (find)

isArmstrong :: Integer -> Bool
isArmstrong n = n == sum (map (^ len) digits)
   where
      digits = map (\x -> read [x] :: Integer) (show n)
      len = length digits

armstrongInRange :: Integer -> Integer -> [Integer]
armstrongInRange a b = filter isArmstrong [a..b]


main :: IO ()
main = do
       let lower = 100
           upper = 1000
       print (armstrongInRange lower upper)

输出

[153,370,371,407]

示例3

在这个例子中,我们将看到如何使用递归在两个区间之间显示阿姆斯特朗数。

import Data.List (find)

isArmstrong :: Integer -> Bool
isArmstrong n = n == sum (map (^ len) digits)
   where
      digits = map (\x -> read [x] :: Integer) (show n)
      len = length digits

armstrongInRange'' :: Integer -> Integer -> [Integer]
armstrongInRange'' a b
   | a > b = []
   | isArmstrong a = a : armstrongInRange'' (a+1) b
   | otherwise = armstrongInRange'' (a+1) b

main :: IO ()
main = do
       let lower = 100
           upper = 1000
       print (armstrongInRange'' lower upper)

输出

[153,370,371,407]

结论

阿姆斯特朗数相对较少,并且仅在较小的数字中找到。它们以Michael F. Armstrong的名字命名,他因发现它们而获得认可。

在Haskell中,要显示两个区间之间的阿姆斯特朗数,我们可以使用用户定义的函数和递归。

更新于:2023年3月13日

111次浏览

开启你的职业生涯

通过完成课程获得认证

开始学习
广告