在递归函数中计算字符串中Char的实例

时间:2017-02-07 17:16:29

标签: haskell recursion

我正在尝试计算字符串中的字符数以及递归函数,但它似乎没有用。

{- characterCounts s
   PRE:  True
POST: a table that maps each character that occurs in s to the number of
     times the character occurs in s
EXAMPLES:
 -}
characterCounts :: String -> Table Char Int
characterCounts [] = Table.empty
characterCounts s = characterCountsAux s Table.empty

characterCountsAux:: String -> Table Char Int -> Table Char Int
characterCountsAux [] table = table
characterCountsAux (x:xs) table = characterCountsAux xs (Table.insert (table) x (count x (x:xs) ))


count:: Char -> String -> Int
count c s = length $ filter (==c) s

如果我这样做:characterCounts "atraa"我应该T [('a',3),('t',1),('r',1)],而是获得T [('a',1),('t',1),('r',1)]

建议将不胜感激。

3 个答案:

答案 0 :(得分:1)

我似乎没有“表格”模块(在GHC中)。

您的代码看起来很奇怪:您似乎遍历所有字符,然后在计数时尝试再次循环(但仅限于列表的尾部)。

在另一条评论中链接的表格模块中有一个“计数”功能。

您应该做类似

的事情
Table.insert table x ((count table x) + 1)

并删除“计数”功能。

添加:您还需要处理表中第一次出现的char。

答案 1 :(得分:1)

你的表看起来很像地图。因此,如果您可以使用Google地图,则可以尝试以下操作:

import qualified Data.Map as M

characterCounts :: [Char] -> M.Map Char Int
characterCounts = foldr ((flip $ M.insertWith (+)) 1) M.empty

现在,characterCounts "atraa"会返回fromList [('a',3),('r',1),('t',1)],即Map Char Int类似于您要求的Table Char Int。如果需要,应该很容易实现转换。

答案 2 :(得分:1)

当你调用characterCountsAux xs _时,你给你的函数列表的其余部分。这意味着在第4次迭代中你正在调用

characterCountsAux "aa" T [('a',3),('t',1),('r',1)]

将表格更改为T [('a',2),('t',1),('r',1)]以及我们在下一次迭代中

characterCountsAux "a" T [('a',2),('t',1),('r',1)]

给你最后的T [('a',1),('t',1),('r',1)]。

一个天真的解决方案是从xs中删除所有出现的x,即

characterCountsAux (x:xs) table = characterCountsAux (filter (/= x) xs) (Table.insert (table) x (count x (x:xs) ))

当然看起来效率不高......