【问题标题】:Haskell flag pattern writing function?Haskell标志模式编写功能?
【发布时间】:2011-12-04 09:00:28
【问题描述】:

在用 Haskell 编写这个函数时我真的需要帮助,我什至不知道从哪里开始。以下是规格:

定义一个函数flagpattern,它接受一个大于或等于5的正Int值并返回一个可以显示为以下维度n的`flag'模式的String,例如

Main> putStr (flagpattern 7)

#######  
##   ##  
# # # #  
#  #  #  
# # # #  
##   ##  
#######

【问题讨论】:

  • 我不明白。这应该看起来像 7 号 ASCii-art 吗?你能用文字而不是一个例子来说明问题吗?
  • @Thomas:在我看来,它就像一个 7x7 盒子里的十字架。您可以使用递归来创建十字架。
  • 它如何寻找偶数 n?另外,我看不出这是特定于 Haskell 的,它主要是解决一般问题,不是吗?
  • 如果您甚至不知道从哪里开始,它很难帮助您。 StackOverflow 在更具体的问题上效果更好

标签: haskell


【解决方案1】:

假设你想要一个包含在 4 行中的“X”,你需要编写一个函数,给定一个坐标 (x,y),返回那个位置应该是什么字符:

coordinate n x y = if i == 0 then 'X' else ' '

(这个版本只输出最左边的X,修改一下,记住索引以0开头)

现在您希望它们很好地排列在一个矩阵中,使用list comprehension,在链接文本中进行了描述。

【讨论】:

    【解决方案2】:

    你应该从你的问题定义开始:

    main :: IO ()
    main = putStr . flagPattern $ 7
    

    然后,你应该问问自己标志有多少点:

    flagPattern :: Int -> String
    flagPattern = magic $ [1..numberOfDots]
    

    那么,magic 函数的(硬)部分应该为每个点决定它是  还是#

    partOfMagic ...
      | ...       = "#" -- or maybe even "#\n" in some cases?
      | otherwise = " "
    

    然后,您可以将部分连接成一个字符串并得到答案。

    【讨论】:

      【解决方案3】:

      从类型签名开始。

      flagpattern :: Int -> String
      

      现在将问题分解为子问题。例如,假设我告诉您生成大小为 7 的标志图案的第 2 行。你会写:

      XX   XX
      

      或者大小为 7 的标志图案的第 3 行将是

      X X X X
      

      所以假设我们有一个可以产生给定行的函数。那么我们就有了

      flagpattern :: Int -> String
      flagpattern size = unlines (??? flagrow ???)
      
      flagrow :: Int -> Int -> String
      flagrow row size = ???
      

      unlines 获取一个字符串列表并将其转换为单个字符串,列表的每个元素之间都有换行符。看看你是否可以定义flagrow,并让它在任何给定的行和大小下正常工作。然后看看能不能用flagrow来定义flagpattern

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-06
        • 2021-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-14
        相关资源
        最近更新 更多