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

更新于:2023年4月24日

213次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告