Haskell程式列印星形帕斯卡三角形


在Haskell中,我們可以使用mapM函式和forM函式來列印星形帕斯卡三角形。

星形帕斯卡三角形是傳統帕斯卡三角形的一種變體,它使用星號(或星形)而不是數字來形成三角形圖案,如下所示。

    *
   * *
  *   *
 *     *
*       *

帕斯卡三角形是一個三角形的數字陣列,其中三角形中的每個數字都是其上方兩個數字之和。在星形帕斯卡三角形中,每個數字都用一個星號表示,因此三角形由星號而不是數字組成。

演算法

  • 步驟1 − 我們將從定義一個使用者自定義函式printLine開始

  • 步驟2 − 程式執行將從main函式開始。main()函式控制整個程式。它寫成main = do。在main函式中,傳遞一個數字,指定要列印的星形帕斯卡三角形圖案的行數。

  • 步驟3 − 初始化名為“lines”的變數。它將儲存要列印的星形帕斯卡三角形圖案的行數。

  • 步驟4 − 呼叫函式後,使用‘putStrLn’語句將結果列印到控制檯。

示例1

在這個示例中,printLine函式接收一個整數列表line和空格數spaces,它列印spaces個空格,然後列印line的元素,要麼是星號,要麼是空格。nextRow函式使用上一行生成星形帕斯卡三角形的下一行。printTriangle函式將printLine函式對映到一個整數列表[1..n]上,其中n是使用者指定的行數。傳遞給printLine函式的引數n - x確保空格數隨著每行的增加而減少,而take x [1,1..]表示式生成每行的元素列表。

module Main where

nextRow :: [Int] -> [Int]
nextRow line = zipWith (+) (0 : line) (line ++ [0])

generateTriangle :: [[Int]]
generateTriangle = iterate nextRow [1]

printTriangle :: Int -> IO ()
printTriangle n = mapM_ printLine (take n generateTriangle)
   where
      printLine line = putStrLn (replicate (n - length line) ' ' ++ unwords (map (\x -> if x == 1 then "*" else " ") line))

main :: IO ()
main = do
   let lines = 5
   printTriangle lines

輸出

    *
   * *
  *   *
 *     *
*       *

示例2

在這個示例中,使用mapM_和replicate函式定義函式來列印星形帕斯卡三角形圖案。

module Main where

nextRow :: [Int] -> [Int]
nextRow line = zipWith (+) (0 : line) (line ++ [0])

generateTriangle :: [[Int]]
generateTriangle = iterate nextRow [1]

printTriangle :: Int -> IO ()
printTriangle n = mapM_ printLine (take n generateTriangle)
   where
      printLine line = putStrLn (replicate (n - length line) ' ' ++ unwords (map (\x -> if x == 1 then "*" else " ") line))

main :: IO ()
main = do
   let lines = 5
   printTriangle lines

輸出

    *
   * *
  *   *
 *     *
*       *

示例3

在這個示例中,使用forM_函式來列印三角形。forM_函式允許我們對列表中的每個元素執行一個操作,並丟棄該操作的結果。這種方法對於列印三角形很有用,因為它允許我們輕鬆地遍歷每一行和每一行中的每個元素,根據需要列印空格和星號。

module Main where
import Control.Monad

nextRow :: [Int] -> [Int]
nextRow xs = zipWith (+) (0 : xs) (xs ++ [0])

generateTriangle :: Int -> [[Int]]
generateTriangle n = take n (iterate nextRow [1])

printTriangle :: Int -> IO ()
printTriangle n = forM_ (generateTriangle n) $ \row -> do
   forM_ [1..n - length row] $ \_ -> putStr " "
   forM_ row $ \x -> if x == 1 then putStr "*" else putStr "  "
   putStrLn "  "

main :: IO ()
main = do
   let lines = 5
   printTriangle lines

輸出

    *
   * *
  *   *
 *     *
*       *

結論

在Haskell中,要列印星形帕斯卡三角形圖案,我們可以使用MapM_、replicate或forM_函式。

更新於: 2023年4月6日

388 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.