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.