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 次浏览

启动你的 职业生涯

通过完成课程获得认证

开始学习
广告