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

nukf8bse  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(230)

我想了解在字符串中查找前缀的实现,它的实现没有使用任何内置的列表函数,而是使用递归来迭代字符串。
尝试:

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

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

checkStringPrefix(_String,_Lookup) ->                    
    "".

它的工作原理是,函数调用自身,递归地将第一个字符与Tail分隔开。
呼叫示例:

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

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

bybem2ql

bybem2ql1#

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

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

无论两个参数字符串的长度如何,这些都是每个调用的选择。
关于第二个函数子句何时被调用的具体问题,我们来回答一下,只要第二个参数是空列表,就会发生这种情况,因为函数头中的特定匹配也会忽略第一个参数。匹配按照声明的顺序发生;第一个函数子句要求两个参数都至少有一个元素,所以当第二个参数是空列表时,它不能匹配第一个子句,因此匹配第二个子句。

相关问题