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_函数。

更新于: 2023年4月6日

388 次浏览

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告
© . All rights reserved.