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

标签 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])]. 

如果我输入城市列表,例如:

> 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/

相关文章:

c# - 从列表中删除 n 行

c++ - 初级 C++ : Transforming index-syntax into iterator-syntax

r - 将命名向量转换为命名列表

c - 递归函数多个返回值

algorithm - 带递归的 Strassen 子三次矩阵乘法算法

recursion - Elixir尾调用递归函数

Docker 版本 :/make: Permission denied

concurrency - Erlang 中的 future 和 promise

testing - Elixir - 在较大的位串中找到子位串

c# - 用于自然排序的 IComparer