【问题标题】:Erlang Understanding recursion: Find if substring is prefix of string recursivelyErlang理解递归:递归查找子字符串是否是字符串的前缀
【发布时间】:2021-07-27 20:16:40
【问题描述】:

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

尝试:

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

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

checkStringPrefix(_String,_Lookup) ->                    
    "".                                         

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

示例调用:

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

在两个不相等的字符的情况下,最后一个函数变体被调用。 我没有完全掌握这个概念,我会很感激解释。我了解递归迭代的过程,我不明白为什么第二个变体会在正确的时刻被调用。

【问题讨论】:

    标签: recursion erlang tail-recursion


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-02-19
      • 2013-02-02
      • 2011-12-06
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多