打印列表时,Erlang shell会冻结

时间:2015-09-16 19:46:50

标签: list erlang

在我尝试打印列表时,我遇到了一个无能为力的问题。 程序编译得很好但是当我运行它时编译器卡住了,不会处理。以下是代码段:

print([]) -> []; 
print([H|T]) -> [H]++print([T]).

我将列表分为头部和尾部,因为后来我计划在其中实现更多操作。所以在此之前我只想测试是否可以打印列表作为用户输入。

我总是从一开始就将函数声明为[print/1]。也许我搞砸了其他地方所以请指出来。

1 个答案:

答案 0 :(得分:1)

这是因为您在递归调用之前将尾部包装到列表中。将print([T])更改为print(T),它会有效。

让我们来看看为什么会这样。考虑调用print([42]),只需要一个元素来保持这个简单。由于列表在Erlang中的工作方式,这可以写成[42 | []]并且意思相同。

所以我们点击print([H | T])H为42,T[]。递归调用是print([T]),最终为print([[]])(包含空列表作为唯一元素的列表)。

众所周知,[[]]可以写成[[] | []]。因此,递归调用再次进入print([H | T])子句, not print([])子句,正如我们所期望的那样。现在,H[]T[]。递归调用print([T])变为print([[]]) ......我们有一个无限循环。