haskell - 如何计算递归中发生警卫语句的次数?
问题描述
我是haskell的新手,我陷入了我试图制作的一个小程序中。我想计算我的守卫语句在所有递归回合中通过的次数,然后将其作为 Int 返回。例如 if c1
is 'a'
, c2
is 'b'
, g
is 2
and s
is"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
解决方案
只需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!!!!
推荐阅读
- php - 循环完成后重定向成功
- php - ReflectionException:文件中不存在类 Tymon\JWTAuth\Http\Middleware\Authenticate
- c# - uwp 获取自定义媒体控件中视觉状态更改的通知
- javascript - Angular 6 不支持属性“catch”
- javascript - 为什么在反应 js 下拉列表中没有触发 onchange?
- json - 如何在 Spring Boot 中直接将 json 表单提交的字段映射到参数?
- c# - 转换为日期时间时出错(字符串未被识别为有效的日期时间。)
- java - 如何从组合框中获取索引
- c# - 在 ASP.NET CORE 2.0 中获取 JSON 结果
- sql - SQL 从 Access 导入数据 - 日期问题