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