我一直在研究一个代码示例,我无法理解发生了什么,我试图理解更简单的例子并得到它们但是在这一点我被卡住了:
seq([X, X | Xs]) -> [X | seq(Xs)];
seq([X, Y | Xs]) -> [X, Y | seq(Xs)];
seq(_) -> [].
Run Code Online (Sandbox Code Playgroud)
当我用[1,1,1,2,2,2,3]在shell中运行它时,得到[1,1,2,2].我一直试图通过将它写在纸上来理解这些步骤,但我陷入了困境.
我很感激所有答案向我解释这里发生的步骤!:)/Eri.
Ale*_*ore 11
好的,我们从列表开始[1,1,1,2,2,2,3].
在第一次调用seq,二郎将匹配前两个元素1,并1以第一个"条款" seq- seq([X, X | Xs]).这将初始化将成为最终返回值的列表[1, seq(Xs)].现在此时Xs将绑定到该值[1,2,2,2,3].如果你想知道为什么在Xs列表的开头没有两个1,那是因为我们匹配/绑定了其中两个[X, X | Xs].
返回值 = [1 | ?] (?是要评估的剩余递归)
Xs =[1,2,2,2,3]
在第二次调用时seq,erlang将匹配输入列表的前两个元素1和2第二个子句seq([X, Y | Xs]).然后我们从该运行中"返回"列表[X,Y]或[1,2],并使用Xs = [2,2,3]调用下一次迭代.
返回值 = [1 | [1, 2 | ?]] < - 查看递归如何嵌套列表?
Xs =[2,2,3]
在第三次调用时,前两个元素再次相同,因此erlang再次运行第一个子句. seq([X, X | Xs]) -> [X | seq(Xs)].我们返回一个2值作为评估的一部分,然后调用seq([3]).
返回值 = [1 | [1, 2 | [2 | ?]]]
Xs =[3]
最后,最后的案例.我们的名单[3]不匹配[X, X | Xs],也没有[X, Y, Xs],所以二郎将运行我们的包罗万象的:seq(_) -> []. _将匹配任何东西,而不是值绑定到任何局部变量,所以我们在这里做的是返回一个空列表[].
我们的最终回报值是: [1 | [1, 2 | [2 | []]]].如果你将它评估为你的erl repl,你会看到它与列表相同[1,1,2,2],后者是前者的语法糖.
| 归档时间: |
|
| 查看次数: |
151 次 |
| 最近记录: |