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_函数,或者可以使用递归函数。