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":因为第一个参数为空,所以不会调用第一个子句,因为第二个参数不为空,因此不会调用第二个子句,所以调用第三个子句,结果为""

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

为了回答您关于何时调用第二个函数子句的特定问题,只要第二个参数是空列表,就会发生这种情况,因为函数头中与该情况有特定匹配,而该函数头也会忽略第一个参数。匹配按申报顺序进行;第一个function子句要求两个参数都至少有一个元素,因此当第二个参数是空列表时,它无法与第一个子句匹配,因此与第二个子句匹配。

最新更新