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次瀏覽

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.