【问题标题】:Creating a hollow rectangle with Haskell用 Haskell 创建一个空心矩形
【发布时间】:2016-05-01 06:43:41
【问题描述】:

我正在尝试找出一种方法,我可以使用如图所示的 haskell 创建一个带有孔的矩形

Main > putStr (hollowedrectangle 4 5)

 *****
 *   *
 *   *
 *****

但是,我知道下面的代码首先实现了 topnbot 行,因此它当前在中间返回一个完整的星号行(topnbot)。我试图弄清楚我需要在我的代码中更改什么,以便它给出上面的结果,而不是下面的结果。

topnbot :: Int->String
topnbot x 
   | x <= 0 = ""
   | x == 1 = "*"++topnbot(x-1)
   | x > 0 = "*"++topnbot(x-1)

leftnright :: Int->Int->String
leftnright x y
   | y==1 = "*"
   | x < 0 = ""
   | x >= 0 = "*"++mid (y-1)
   where
    mid :: Int->String
    mid z
      | z <= 0 = ""
      | z == 1 = leftnright x z
      | z > 0 =  " "++mid (z-1)

hollowedrectangle :: Int->Int->String
hollowedrectangle a m 
  | m == 0 = topnbot m
  | a == 0 = ""
  | a < 3 = topnbot m
  | a >= 3 && m >= 3 = topnbot m ++"\n"++leftnright a m ++ "\n" ++hollowedrectangle (a-1) m 

这会导致

  Main > putStr (hollowedrectangle 4 5)
    *****
    *   *
    *****
    *   *
    *****

谢谢!

【问题讨论】:

    标签: string haskell recursion


    【解决方案1】:

    你的代码比我喜欢阅读的更长更复杂,所以让我给你一些提示:

    首先,写一个函数

    replicate :: Int -> a -> [a]
    

    创建一个给定长度的列表,其元素都是给定的。所以

    replicate 3 7 = [7,7,7]
    replicate 4 'a' = "aaaa"
    

    为了效率,写replicate而不使用++。通过键入来测试它的效率

    replicate (2^30) 'x' !! 10000
    

    在 GHCi 提示符下。如果你有时间在它吐出答案之前眨眼,那你就做错了。

    你能弄清楚如何使用replicate++ 来生成顶行、底行和中间行之一吗?你能弄清楚如何使用replicate 来生成所有中间行吗?

    P.S.,replicate 函数在标准库中是可用的,但你不应该在编写之前寻找它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多