【问题标题】:Count the number of 'a' and 'A' characters in a string using only recursion and pattern matching仅使用递归和模式匹配计算字符串中“a”和“A”字符的数量
【发布时间】:2021-12-04 06:01:14
【问题描述】:

实现countA :: [Char] -> Int函数,计算字符串中字符aA的出现次数。

提示:一个项目是a 还是A 或其他一些元素可以通过使用模式匹配来检查。


例如:

countA "Appleapplet" == 2

countA "Nietzsche" == 0

我是学习 Haskell 的初学者,我首先想到的是做一个 if-then-else 声明,但这不是答案,因为我必须这样做与模式匹配。我什至不知道从哪里开始,也不完全理解模式匹配在列表上的工作原理。在这个练习中我不能使用任何导入的函数。

【问题讨论】:

  • if-then-else 绝对可以成为答案的一部分。

标签: haskell count counting


【解决方案1】:

可以使用if-then-else 来检查列表的第一个字符是'a' 还是'A',尽管模式匹配可能更优雅.

您需要的是一个递归函数,其基本情况是空列表 (1),在这种情况下,aA 发生的总次数是 0。对于递归情况,我们使用一个非空列表,x 是第一个字符,xs 是列表的尾部(可能是空的)。在这种情况下,我们可以检查第一个字符 x 是否等于 'a''A' 并在这种情况下递增递归调用的结果。因此,我们可以将其实现为:

countA :: String -> Int
countA [] = …  -- (1)
contaA (x:xs) = if x == 'a' || x == 'A' then … else …  -- (2)

您仍然需要填写 部分。第二种情况 (2) 中的那些将需要进行递归调用。

【讨论】:

  • 试过你的答案并且它有效,但我也很好奇这在模式匹配中会是什么样子。你能告诉我吗?
  • @AWheelbarrow:您使用三行代替contaA (x:xs) = if x == 'a' || x == 'A' then … else …contaA ('a':xs) = ...contaA ('A':xs) = ...contaA (x:xs) = ...。仅当 ('a': xs)('A': xs) 的模式匹配失败时,最后一种情况才会匹配。
  • 我需要写什么来代替...-s?如果我尝试countA ('a':xs) = countA('A':xs) + countA(xs)countA ('A':xs) = countA('a':xs) + countA(xs)countA (x:xs) = 0,我的程序会冻结,并且不会打印出任何内容。
  • @AWheelbarrow:你应该递归调用尾部xs,而不是头部。对于某些子句,您应该添加1countA (x:xs) 也应该进行递归调用。
  • 这些子句中的前两个因此应该与列表尾部的递归一起使用,并将一个添加到递归的结果中,最后一个应该只在列表的尾部递归。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 2011-02-28
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
相关资源
最近更新 更多