首页 > 解决方案 > 如何计算递归中发生警卫语句的次数?

问题描述

我是haskell的新手,我陷入了我试图制作的一个小程序中。我想计算我的守卫语句在所有递归回合中通过的次数,然后将其作为 Int 返回。例如 if c1is 'a', c2is 'b', gis 2and sis"aaabbb"然后返回 int 将是 2,因为我的保护语句在 2 种情况下为真。

我尝试制作变量x,然后在x + 1每次发生警卫语句时添加它。这不起作用,因为我了解到在 Haskell 变量中您设置的始终是静态的,因此例如x = 0在开始时设置将x在每个递归轮次中将其设置为 0。

这是我的代码:

gaps :: (Char, Char) -> Int -> String -> Int
gaps (c1,c2) g (s:xs)
   | c1 == s && c2 == (s:xs) !! g = --Count how many times this statement happens --
   | otherwise =  gaps (c1,c2) g xs

标签: haskell

解决方案


只需1递归地添加和调用函数

gaps :: (Char, Char) -> Int -> String -> Int
gaps _ _ [] = 0                                           -- base case 
gaps (c1,c2) g (s:xs)
   | c1 == s && c2 == (s:xs) !! g = 1 + gaps (c1,c2) g xs -- add one to final result
   | otherwise =  gaps (c1,c2) g xs

> gaps ('a','b') 2 "aaabbb"
2
> gaps ('a','b') 3 "aaaabbbb"
3

使用时要小心 !!c1如果您的输入字符串的值小于g字符串结尾之前的位置,则它不是全部并且可能会失败

> gaps ('a','b') 3 "aaaababbb" -- doesn't fail
3
> gaps ('a','b') 3 "aaaabbabb" -- does fail!!!!

推荐阅读