Haskell 程序创建金字塔"and"模式
在本教程中,我们将了解如何开发一个 Haskell 程序,该程序将使用 mapM、forM 和递归函数创建 "&" 金字塔模式。
金字塔 "&" 模式是 "&" 或其他符号的设计或排列,形状呈金字塔形,如下所示。
& &&& &&&&& &&&&&&& &&&&&&&&&
它是通过在多行中打印 "&" 或符号来创建的,从顶部开始向下移动。每行比前一行多一个符号,从而产生三角形的错觉。该模式通常是对称的,每行中的 "&" 或符号数等于行号,每行的中间垂直排列。
算法
步骤 1 - 使用内部函数定义一个函数
步骤 2 - 程序执行将从主函数开始。main() 函数完全控制程序。它写为 main = do。在主函数中,传递一个数字,金字塔 "&" 模式将打印到该数字。
步骤 3 - 名为"n"的变量正在初始化。它将保存要打印金字塔星形模式的整数。
步骤 4 - 调用函数后,使用"putStrLn"语句将结果打印到控制台。
示例 1
在此示例中,定义了一个函数金字塔,该函数以整数 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_ 函数,或者我们可以使用递归函数。