【问题标题】:Haskell Recursion with Chars带字符的 Haskell 递归
【发布时间】:2018-07-20 09:29:21
【问题描述】:

编写递归 Haskell 函数

makeString :: Int -> Char -> Char -> String

使得makeString n ch1 ch2 返回如下字符串:

  • 当 n 为正数时,字符串长度为 3n-2,包含 n 个副本 ch1,每个副本由 ch2 的两个副本分隔。
  • 当n小于等于0时,字符串为空字符串。

例如,该函数具有以下行为:

Main > makeString 5 'a' '!'
"a!!a!!a!!a!!a"
Main > makeString 1 'a' '!'
"a"
Main > makeString 10 '6' '#'
"6##6##6##6##6##6##6##6##6##6"

到目前为止,我有:

makeString :: Int -> Char -> Char -> String
makeString n ch1 ch2
           |n <= 0        = [ ]
           |otherwise     = ch1: makeString(3*n-2)(ch2)(ch1)

Main> makeString 5 'a' '!'
"a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a"

【问题讨论】:

  • 你为什么要用n = 3*n-2递归调用你的函数?这样做的目的是什么?
  • 有人告诉我使用 3n-2,所以我认为这就是意思。
  • 老实说,我只是尝试了任何东西,因为它没有任何意义。
  • 一些固定的代码看起来更好,但仍然不存在。系列 :: Int -> Int -> [Int] 系列 n 项 | n [[Int]] doubleCount n |n [[Int]] helper i |i > n = [ ] |otherwise = (series in) : helper(i+1)
  • 给我:*Main> doubleCount 6 [[6],[6,6],[6,6,6],[6,6,6,6],[6,6, 6,6,6],[6,6,6,6,6,6]]

标签: string haskell recursion


【解决方案1】:

这是我的解决方案:

makeString :: Int -> Char -> Char -> String
makeString n ch1 ch2
  | n <= 0 = ""
  | n == 1 = [ch1]
  | otherwise = [ch1, ch2, ch2] ++ makeString (n-1) ch1 ch2

【讨论】:

    【解决方案2】:

    快速而肮脏的实现

    module Test where
    
    merge :: [a] -> [a] -> [a]
    merge xs [] = xs
    merge [] ys = ys
    merge (x:xs) (y:ys) = x : y : y : merge xs ys
    
    makeString :: Int -> Char -> Char -> String
    makeString 0 _ _ = []
    makeString n ch1 ch2 = take ((3 * n) - 2) $ merge (replicate (3 * n) ch1) (replicate (3 * n) ch2)
    

    replicatemerge 创建足够长的列表以完成其工作。适用于所有积极的ns

    【讨论】:

      猜你喜欢
      • 2015-07-31
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      相关资源
      最近更新 更多