我无法理解为什么我的函数似乎在递归中无限循环:
-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])].
如果我输入城市列表,例如:
> list_tut:print_cities(['莫斯科', '东京', '斯德哥尔摩']).
它会很快打印所有项目,然后继续打印cities: []
。
我知道这绝对是初学者的问题,但我已经研究这个问题很长时间了,并且无法找出在不添加尾递归或类似内容的情况下解决它的方法。
最佳答案
这是因为您使用 [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)].
1> c(list_tut).
{ok,list_tut}
2> list_tut:print_cities(['Moscow', 'Tokyo', 'Stockholm']).
city: 'Moscow'
city: 'Tokyo'
city: 'Stockholm'
['Moscow','Tokyo','Stockholm'|ok]
我不确定为什么要在打印函数中重新创建列表,但如果您想要返回原始列表,则 []
案例应返回 []
如果您希望最终返回值与初始返回值相同。
...
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']
关于list - 在自己的行上打印列表的所有项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44474252/