微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Erlang 理解递归:递归查找子字符串是否是字符串的前缀

如何解决Erlang 理解递归:递归查找子字符串是否是字符串的前缀

我想了解这个在字符串中查找前缀的实现,该实现没有使用任何内置列表函数,而是使用递归来遍历字符串。

尝试:

checkStringPrefix([C|StringTail],[C|LookupTail]) ->
checkStringPrefix(StringTail,LookupTail);

checkStringPrefix(_,[]) ->                            
    "***";                                    

checkStringPrefix(_String,_Lookup) ->                    
    "".                                         

它起作用了,函数调用自己递归地将第一个字符与尾部分开。

示例调用

1> stringUtil:checkStringPrefix("test xxxxx","test").
"***"
2> stringUtil:checkStringPrefix("test xxxxx","testtt"). 
[]

在两个不相等的字符的情况下,最后一个函数变体被调用。 我不完全理解这个概念,我希望得到解释。我了解递归迭代的过程,我不明白的是为什么在正确的时刻调用第二个变体。

解决方法

考虑将单个字符串或空字符串作为参数传递时会发生什么:

  • 传递 "a""a":这会调用 checkStringPrefix/2 的第一个子句,因为显式匹配其函数头中两个参数的第一个元素,这也强制两个参数都不能是空列表。该子句递归调用该函数,并且由于两个参数都没有尾部,因此第二个函数子句被调用,因为第二个参数与空列表匹配,因此结果为 "***"
  • 传递"a""b":这不会调用第一个子句,因为第一个元素不匹配,它不会调用第二个子句,因为第二个参数不是空的列表。因此它调用第三个子句,所以结果是 ""
  • 传递"""":这不会调用第一个子句,因为两个参数都是空列表;它调用第二个子句,因为第二个参数匹配空列表,所以结果是 "***"。事实上,由于第二个子句将其第一个参数视为无关紧要,因此即使第一个参数非空,同样的分析也适用。
  • 传递"""a":这不会调用第一个子句,因为第一个参数为空,它不会调用第二个子句,因为第二个参数不为空,所以它调用第三个子句,结果为 ""

无论两个参数字符串的长度如何,这些都是每次调用的选择。

要回答有关何时调用第二个函数子句的具体问题,它会在第二个参数为空列表时发生,因为函数头中该情况的特定匹配,并且该函数头也忽略了第一个参数.匹配按声明的顺序发生;第一个函数子句要求两个参数至少有一个元素,所以当第二个参数是空列表时,它不能匹配第一个子句,所以匹配第二个子句。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。