List 在自己的行上打印列表的所有项目

List 在自己的行上打印列表的所有项目,list,recursion,erlang,List,Recursion,Erlang,我很难理解为什么我的函数似乎在递归中无休止地循环: -module(list_tut). -export([print_cities/1]). -author("kimput"). print_cities([]) -> ok; print_cities([H|T]) -> io:format('city: ~p~n', [H]), [H|print_cities([T])]. 如果我输入一个城市列表,如: >列表:打印城市(['Moscow'、'Tokyo'、'

我很难理解为什么我的函数似乎在递归中无休止地循环:

-module(list_tut).
-export([print_cities/1]).
-author("kimput").

print_cities([]) ->
  ok;

print_cities([H|T]) ->
  io:format('city: ~p~n', [H]),
  [H|print_cities([T])]. 
如果我输入一个城市列表,如:

>列表:打印城市(['Moscow'、'Tokyo'、'Stockholm'])。

它以相当快的速度打印所有项目,然后继续打印城市:[]


我知道这是一个绝对初学者的问题,但我已经研究这个问题很长时间了,如果不添加尾部递归或类似的东西,我想不出一种解决方法。

这是因为你用
[t]
而不是
t
递归
T
是已经是列表的列表的尾部(如果列表不是不正确的列表)。您的代码将尾部包装在另一个列表中,这意味着除了无限递归之外,打印的初始元素也是错误的:

1> c(list_tut).
{ok,list_tut}
2> list_tut:print_cities(['Moscow', 'Tokyo', 'Stockholm']).
city: 'Moscow'
city: ['Tokyo','Stockholm']
city: []
city: []
city: []
city: []
city: []
...
[H | print_cities([T])]更改为
[H | print_cities(T)]。
修复了以下问题:

-module(list_tut).
-export([print_cities/1]).
-author("kimput").

print_cities([]) ->
  ok;

print_cities([H|T]) ->
  io:format('city: ~p~n', [H]),
  [H|print_cities(T)].

我不确定您为什么要在打印函数中重新创建列表,但是如果您希望返回原始列表,
[]
案例应该返回
[]
,如果您希望最终返回值与初始值相同

...
print_cities([]) ->
  [];
...

谢谢你,伙计!我确信这是代码中的一个小错误。天哪,我现在感到羞愧P
...
print_cities([]) ->
  [];
...
1> c(list_tut).
{ok,list_tut}
2> list_tut:print_cities(['Moscow', 'Tokyo', 'Stockholm']).
city: 'Moscow'
city: 'Tokyo'
city: 'Stockholm'
['Moscow','Tokyo','Stockholm']