Haskell程式建立金字塔“&”圖案


在本教程中,我們將瞭解如何開發一個Haskell程式,該程式將使用mapM、forM和遞迴函式建立“&”的金字塔圖案。

金字塔“&”圖案是一種設計或排列“&”或其他符號以形成金字塔形狀的圖案,如下所示。

    &
   &&&
  &&&&&
 &&&&&&&
&&&&&&&&&

它是透過列印多行“&”或符號建立的,從頂部開始向下移動。每一行比上一行多一個符號,從而產生三角形的錯覺。該圖案通常是對稱的,每一行中的“&”或符號數量等於行號,並且每一行的中間垂直對齊。

演算法

  • 步驟1 - 使用內部函式定義一個函式

  • 步驟2 - 程式執行將從主函式開始。main() 函式控制整個程式。它寫成 main = do。在主函式中,傳遞一個數字,將列印到該數字為止的金字塔“&”圖案。

  • 步驟3 - 變數名為“n”。它將儲存要列印到該數字為止的金字塔星形圖案的整數。

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

示例1

在此示例中,定義了一個名為pyramid的函式,該函式以整數n作為引數,並使用mapM_列印buildPyramid函式生成的列表中的每個元素。buildPyramid函式以n作為引數,並生成一個表示金字塔“&”圖案的字串列表。它使用列表推導式為金字塔的每一行生成一個字串,方法是連線兩個字串。

pyramid :: Int -> IO ()
pyramid n = mapM_ putStrLn $ buildPyramid n
   where
      buildPyramid :: Int -> [String]
      buildPyramid n = [replicate (n-i) ' ' ++ replicate (2*i-1) '&' | i <- [1..n]]

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

輸出

    &
   &&&
  &&&&&
 &&&&&&&
&&&&&&&&&

示例2

在此示例中,定義了一個名為pyramid的函式,該函式以整數n作為引數,並使用forM_函式迭代範圍[1..n]。傳遞給forM_的函式是一個匿名函式(也稱為lambda函式),它接受一個引數i,並使用putStrLn列印透過連線兩個字串生成的字串。

import Control.Monad
pyramid :: Int -> IO ()
pyramid n = forM_ [1..n] $ \i -> putStrLn $ (replicate (n-i) ' ') ++ (replicate (2*i-1) '&')

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

輸出

    &
   &&&
  &&&&&
 &&&&&&&
&&&&&&&&&

示例3

在此示例中,定義了一個名為printTriangle的函式,該函式接受兩個引數:一個整數n表示行數,一個整數i表示當前行。該函式檢查i是否大於n,如果是,則該函式返回而不執行任何操作。如果i不大於n,則該函式使用putStrLn函式列印一行i個“&”,然後呼叫自身並將i加1。這種遞迴方法將持續進行,直到i大於n,此時函式返回。

drawLine :: Int -> Int -> IO ()
drawLine n k = do
   let spaces = replicate (n - k) ' '
   let stars = replicate (2 * k - 1) '&'
   putStrLn (spaces ++ stars)

drawPyramid :: Int -> IO ()
drawPyramid n = mapM_ (drawLine n) [1..n]

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

輸出

    &
   &&&
  &&&&&
 &&&&&&&
&&&&&&&&&

結論

在Haskell中,要列印金字塔“&”圖案,我們可以使用MapM_或forM_函式,或者可以使用遞迴函式。

更新於: 2023年4月6日

143 次瀏覽

啟動你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.