Haskell程序打印半菱形星号图案


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

算法

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

  • 步骤2 - 程序执行将从main函数开始。main()函数控制整个程序。它写成main = do。在main函数中,传递一个数字,以此数字为上限打印半菱形星号图案。

  • 步骤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作为参数,并返回一个字符串,该字符串通过连接printRow在范围[0..n - 1]中每一行的结果创建。

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和递归函数。

更新于:2023年4月6日

113 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告