用于打印半菱形星形图案的 Haskell 程序

haskellserver side programmingprogramming

我们可以使用递归和复制函数在 Haskell 中创建半菱形星形图案。半菱形星形图案是由排列成半菱形的星号 (*) 组成的图案。它通常通过打印金字塔形状的一系列星号来创建,从第一行的一个星号开始,第二行的两个星号,依此类推,直到中间一行包含最大数量的星号。从那一行开始,星号的数量不断减少,直到最后一行只有一个星号。

算法

  • 步骤 1 - 使用复制/递归函数定义 printRow 函数

  • 步骤 2 - 程序执行将从主函数开始。 main() 函数对程序有完全的控制权。它写为 main = do。在主函数中,传递一个数字,以指示要打印的半菱形星形图案。

  • 步骤 3 - 初始化名为"n"的变量。它将保存要打印的半菱形星形图案的整数。

  • 步骤 4 - 调用函数后,使用"putStrLn"语句将结果打印到控制台。

示例 1

在此示例中,printRow 是一个递归函数,它接受两个参数 n 和 i,分别表示图案的大小和当前行。如果 i 等于 0,则返回换行符。如果 i 小于或等于 n div 2,则返回一个字符串,其空格等于 n div 2 - i,后跟一个星号,后跟一个换行符,然后递归调用 printRow,更新后的行号为 i - 1。否则,返回一个字符串,其空格等于 i - n div 2,后跟一个星号,后跟一个换行符,然后递归调用 printRow,更新后的行号为 i - 1。

module Main where

printRow :: Int -> Int -> String
printRow n i
   | i == 0    = "
" | i <= n `div` 2 = " " ++ replicate (n `div` 2 - i) ' ' ++ "*" ++ "
" ++ printRow n (i - 1) | otherwise = " " ++ replicate (i - n `div` 2) ' ' ++ "*" ++ "
" ++ printRow n (i - 1) printPattern :: Int -> String printPattern n = printRow n (n - 1) main :: IO () main = putStr (printPattern 8)

输出

   *
  *
 *
*
 *
  *
   *

示例 2

在此示例中,printRow 函数采用两个参数 n 和 i,分别表示模式的大小和当前行。它返回一个字符串,其中空格等于 n div2 - abs (ndiv 2 - i),后跟一个星号和一个换行符。

printPattern 函数采用整数 n 作为参数,并返回一个字符串,该字符串由范围 [0..n - 1] 内每行的 printRow 结果连接而成。

module Main where

printRow :: Int -> Int -> String
printRow n i = replicate (n `div` 2 - abs (n `div` 2 - i)) ' ' ++ "*
" printPattern :: Int -> String printPattern n = concat [ printRow n i | i <- [0..n - 1]] main :: IO () main = putStr (printPattern 8)

输出

*
 *
  *
   *
    *
   *
  *
 *

结论

在 Haskell 中,要打印半菱形星形图案,我们可以使用 replicate、div 和递归函数。


相关文章