Haskell程序打印金字塔星形图案


在Haskell中,我们可以使用mapM和ForM函数来打印金字塔形状的星形图案。金字塔星形图案是星形或其他符号以金字塔形状排列的设计或布局。它是通过打印多行星形或符号来创建的,从顶部开始向下移动。每一行比前一行多一个符号,从而产生三角形的视觉效果。该图案通常是对称的,每行中的星形或符号数量等于行号,并且每行的中间垂直对齐。

算法

  • 步骤1 − 使用mapM_函数定义金字塔函数

  • 步骤2 − 程序执行将从main函数开始。main()函数控制整个程序。它被写成main = do。在main函数中,传递一个数字,该数字表示要打印金字塔星形图案的范围。

  • 步骤3 − 初始化名为“n”的变量。它将保存要打印金字塔星形图案的整数范围。

  • 步骤4 − 函数调用后,使用'putStrLn'语句将结果打印到控制台。

在这个例子中,定义了一个名为pyramid的函数,它接受一个整数n作为参数,并使用mapM_打印buildPyramid函数生成的列表中的每个元素。buildPyramid函数接受n作为参数,并生成一个表示金字塔图案的字符串列表。它使用列表推导式为金字塔的每一行生成一个字符串,方法是连接两个字符串。

示例1

在这个例子中,使用mapM_函数定义了pyramid函数来打印金字塔星形图案。

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打印通过连接两个字符串生成的字符串。

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

输出

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

示例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月20日

161次浏览

开启你的职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.