在我尝试打印列表时,我遇到了一个无能为力的问题。 程序编译得很好但是当我运行它时编译器卡住了,不会处理。以下是代码段:
print([]) -> [];
print([H|T]) -> [H]++print([T]).
我将列表分为头部和尾部,因为后来我计划在其中实现更多操作。所以在此之前我只想测试是否可以打印列表作为用户输入。
我总是从一开始就将函数声明为[print/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([[]])
......我们有一个无限循环。