簡體   English   中英

帶字符的 Haskell 遞歸

[英]Haskell Recursion with Chars

編寫遞歸 Haskell 函數

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

使得makeString n ch1 ch2返回一個字符串,如下所示:

  • 當 n 為正數時,字符串長度為 3n-2 並包含 ch1 的 n 個副本,每個副本由 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"

快速而骯臟的實現

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)

replicate創建足夠長的列表供merge完成其工作。 適用於所有正n s

這是我的解決方案:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM