Haskell 程式列印反向金字塔星形圖案


Haskell 具有 mapM 和 ForM 等內部函式,可以列印反向金字塔星形圖案。

反向金字塔星形圖案是由星號(星形)組成的圖案,排列成倒置的金字塔形狀。

演算法

  • 步驟 1 − 程式執行將從主函式開始。main() 函式控制整個程式。它被寫成 main = do。在主函式中,傳遞一個數字,用於指定要列印的反向金字塔星形圖案的高度。主函式定義了 mapM_ 函式,如下所示:

  • 步驟 2 − 初始化名為“n”的變數。它將儲存要列印的反向金字塔星形圖案的高度(整數)。

  • 步驟 3 − 函式呼叫完成後,使用 'putStrLn' 語句將結果列印到控制檯。

示例 1

在這個示例中,定義了一個主函式,它使用 mapM_ 函式將 putStrLn 操作應用於列表 [replicate i ' ' ++ replicateicate (2 * (n - i) - 1) '*' | i <- [0..n - 1]] 中的每個元素。replicate 函式用於建立空格和星號的字串,而 ++ 運算子用於連線字串。

module Main where

main :: IO ()
main = do
   let n = 5
   mapM_ putStrLn [replicate i ' ' ++ replicate (2 * (n - i) - 1) '*' | i <- [0..n - 1]]

輸出

*********
 *******
  *****
   ***
    *

示例 2

在這種方法中,定義了一個主函式,它使用 Control.Monad 模組中的 forM_ 函式迭代列表 [n, n-1..1]。傳遞給 forM_ 的函式以整數 i 作為引數,並透過連線兩次對 replicate 函式的呼叫結果來建立一個字串。第一次呼叫 replicate 建立一個包含 n - i 個空格的字串,而第二次呼叫建立包含 2 * i - 1 個星號的字串。然後,使用 putStrLn 函式將生成的字串列印到控制檯。

module Main where

import Control.Monad

main :: IO ()
main = do
   let n = 5
   forM_ [n, n-1..1] $ \i -> do
      putStrLn $ replicate (n - i) ' ' ++ replicate (2 * i - 1) '*'

輸出

*********
 *******
  *****
   ***
    *

示例 3

在這個示例中,定義了一個函式 printStars,它接受兩個引數 n 和 i。如果 i 等於 0,則函式返回 ()。否則,函式首先透過連線兩次對 replicate 函式的呼叫結果來建立一個空格和星號的字串,然後使用 putStrLn 將字串列印到控制檯。最後,函式遞迴呼叫自身,並將 i 減 1,直到 i 等於 0。

module Main where

printStars :: Int -> Int -> IO ()
printStars n i
   | i == 0    = return ()
   | otherwise = do
      putStrLn $ replicate (n - i) ' ' ++ replicate (2 * i - 1) '*'
      printStars n (i - 1)

main :: IO ()
main = do
   let n = 5
   printStars n n

輸出

*********
 *******
  *****
   ***
    *

結論

在 Haskell 中,要列印反向金字塔星形圖案,我們可以使用 MapM_ 或 forM_ 函式,或者可以使用遞迴函式。

更新於: 2023年4月20日

160 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.