Haskell程序打印星形帕斯卡三角形
在Haskell中,我们可以使用mapM函数和forM函数来打印星形帕斯卡三角形。
星形帕斯卡三角形是传统帕斯卡三角形的一种变体,它使用星号(或星形)而不是数字来形成三角形图案,如下所示。
* * * * * * * * *
帕斯卡三角形是一个三角形的数字阵列,其中三角形中的每个数字都是其上方两个数字之和。在星形帕斯卡三角形中,每个数字都用一个星号表示,因此三角形由星号而不是数字组成。
算法
步骤1 − 我们将从定义一个用户自定义函数printLine开始
步骤2 − 程序执行将从main函数开始。main()函数控制整个程序。它写成main = do。在main函数中,传递一个数字,指定要打印的星形帕斯卡三角形图案的行数。
步骤3 − 初始化名为“lines”的变量。它将保存要打印的星形帕斯卡三角形图案的行数。
步骤4 − 调用函数后,使用‘putStrLn’语句将结果打印到控制台。
示例1
在这个示例中,printLine函数接收一个整数列表line和空格数spaces,它打印spaces个空格,然后打印line的元素,要么是星号,要么是空格。nextRow函数使用上一行生成星形帕斯卡三角形的下一行。printTriangle函数将printLine函数映射到一个整数列表[1..n]上,其中n是用户指定的行数。传递给printLine函数的参数n - x确保空格数随着每行的增加而减少,而take x [1,1..]表达式生成每行的元素列表。
module Main where
nextRow :: [Int] -> [Int]
nextRow line = zipWith (+) (0 : line) (line ++ [0])
generateTriangle :: [[Int]]
generateTriangle = iterate nextRow [1]
printTriangle :: Int -> IO ()
printTriangle n = mapM_ printLine (take n generateTriangle)
where
printLine line = putStrLn (replicate (n - length line) ' ' ++ unwords (map (\x -> if x == 1 then "*" else " ") line))
main :: IO ()
main = do
let lines = 5
printTriangle lines
输出
* * * * * * * * *
示例2
在这个示例中,使用mapM_和replicate函数定义函数来打印星形帕斯卡三角形图案。
module Main where
nextRow :: [Int] -> [Int]
nextRow line = zipWith (+) (0 : line) (line ++ [0])
generateTriangle :: [[Int]]
generateTriangle = iterate nextRow [1]
printTriangle :: Int -> IO ()
printTriangle n = mapM_ printLine (take n generateTriangle)
where
printLine line = putStrLn (replicate (n - length line) ' ' ++ unwords (map (\x -> if x == 1 then "*" else " ") line))
main :: IO ()
main = do
let lines = 5
printTriangle lines
输出
* * * * * * * * *
示例3
在这个示例中,使用forM_函数来打印三角形。forM_函数允许我们对列表中的每个元素执行一个操作,并丢弃该操作的结果。这种方法对于打印三角形很有用,因为它允许我们轻松地遍历每一行和每一行中的每个元素,根据需要打印空格和星号。
module Main where import Control.Monad nextRow :: [Int] -> [Int] nextRow xs = zipWith (+) (0 : xs) (xs ++ [0]) generateTriangle :: Int -> [[Int]] generateTriangle n = take n (iterate nextRow [1]) printTriangle :: Int -> IO () printTriangle n = forM_ (generateTriangle n) $ \row -> do forM_ [1..n - length row] $ \_ -> putStr " " forM_ row $ \x -> if x == 1 then putStr "*" else putStr " " putStrLn " " main :: IO () main = do let lines = 5 printTriangle lines
输出
* * * * * * * * *
结论
在Haskell中,要打印星形帕斯卡三角形图案,我们可以使用MapM_、replicate或forM_函数。
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP