Haskell程序打印直角三角形星号图案
在Haskell中,我们可以使用mapM、forM以及递归函数来创建一个简单的直角三角形星号图案。
什么是直角三角形星号图案?
直角三角形图案是由一系列星号或其他字符排列成三角形形状。对于直角三角形图案,三角形的底边是最长边,与水平轴对齐,而其他两条边构成直角。三角形每一行的星号或字符数量随着向上移动而减少,因此顶行只有一个星号或字符。
算法
步骤1 − 使用mapM_函数定义printTriangle函数
步骤2 − 程序执行将从main函数开始。main()函数控制整个程序。它被写成main = do。在main函数中,传递一个数字,该图案将打印到该数字。
步骤3 − 变量“n”被初始化。它将保存要打印图案的整数。
步骤4 − 函数调用后,使用'putStrLn'语句将结果打印到控制台。
示例1
在这个例子中,定义了一个printTriangle函数,它接受一个整数n作为输入,并生成一个字符串列表,每个字符串包含一定数量的星号。mapM_函数用于将putStrLn函数应用于列表中的每个字符串,有效地打印三角形的每一行。
module Main where printTriangle :: Int -> IO () printTriangle n = mapM_ putStrLn [replicate i '*' | i <- [1..n]] main :: IO () main = do let n = 5 printTriangle n
输出
* ** *** **** *****
示例2
在这个例子中,Control.Monad模块中的forM_函数用于迭代从1到n的整数范围,并为每次迭代打印一行星号。putStrLn函数用于打印每一行,replicate函数用于生成一个包含i个星号的字符串,其中i是当前迭代次数。
import Control.Monad printTriangle :: Int -> IO () printTriangle n = forM_ [1..n] $ \i -> putStrLn (replicate i '*') main :: IO () main = do let n = 5 printTriangle n
输出
* ** *** **** *****
示例3
在这个例子中,定义了一个printTriangle函数,它接受两个参数:一个整数n表示行数,一个整数i表示当前行。该函数检查i是否大于n,如果是,则函数返回而无需执行任何操作。如果i不大于n,则函数使用putStrLn函数打印一行i个星号,然后调用自身并将i递增1。这种递归方法一直持续到i大于n,此时函数返回。
printTriangle :: Int -> Int -> IO () printTriangle n i | i > n = return () | otherwise = do putStrLn (replicate i '*') printTriangle n (i+1) main :: IO () main = do let n = 5 printTriangle n 1
输出
* ** *** **** *****
结论
在Haskell中,要打印直角三角形图案,我们可以使用MapM_或forM_函数,或者可以使用递归函数。