我想了解在字符串中查找前缀的实现,它的实现没有使用任何内置的列表函数,而是使用递归来迭代字符串。
尝试:
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").
[]
在两个不相等的字符的情况下,最后一个函数变量被调用。我不完全理解这个概念,我希望得到解释。我理解递归迭代的过程,我不明白的是为什么第二个变量在正确的时刻被调用。
1条答案
按热度按时间bybem2ql1#
考虑将单个字符串或空字符串作为参数传递时会发生什么:
"a"
和"a"
:这调用了checkStringPrefix/2
的第一个子句,因为它显式地匹配函数头中两个参数的第一个元素,这也强制两个参数都不能是空列表。这个子句递归地调用函数,因为两个参数都没有尾部,所以调用第二个函数子句,因为第二个参数匹配空列表,所以结果是"***"
。"a"
和"b"
:它不会调用第一个子句,因为第一个元素不匹配,也不会调用第二个子句,因为第二个参数不是空列表,因此它调用第三个子句,结果是""
。""
和""
:这不会调用第一个子句,因为两个参数都是空列表;它调用第二个子句,因为第二个参数与空列表匹配,所以结果是"***"
。实际上,由于第二个子句将其第一个参数视为无关,因此即使第一个参数非空,也可以应用相同的分析。""
和"a"
:它不会调用第一个子句,因为第一个参数为空,也不会调用第二个子句,因为第二个参数不为空,所以它调用第三个子句,结果为""
.无论两个参数字符串的长度如何,这些都是每个调用的选择。
关于第二个函数子句何时被调用的具体问题,我们来回答一下,只要第二个参数是空列表,就会发生这种情况,因为函数头中的特定匹配也会忽略第一个参数。匹配按照声明的顺序发生;第一个函数子句要求两个参数都至少有一个元素,所以当第二个参数是空列表时,它不能匹配第一个子句,因此匹配第二个子句。