从Erlang中的列表中打印每个元素

时间:2015-09-18 18:50:43

标签: list erlang

我创建了一个函数,用于检查给定列表中是否有偶数,然后在列表中收集偶数。但是我被困在我想要在新行中打印出该列表中每个偶数的位置。

这是我的代码段:

even_print([])-> [];
even_print([H|[]]) -> [H];
even_print([H|T]) when H rem 2 /= 0 -> even_print(T);
even_print([H|T]) when H rem 2 == 0 -> [H|even_print(T)],
io:format("printing: ~n", H).

我在考虑列表推导,但我也想在没有列表推导的情况下尝试它。

2 个答案:

答案 0 :(得分:7)

你非常接近,但你在这里有几个可疑的功能条款:

  • 第二个子句,参数为[H|[]],不需要,因为以下[H|T]参数的子句将处理T[]时的情况}。
  • 最后一个句子不需要保护,因为第三个已经跳过了每个奇数值。请注意,它构建的列表[H|even_print(T)],因为您没有使用它而被删除。它必须是函数中的最后一个表达式,因此它被视为返回值。此外,io:format/2的最后一个参数必须有一个列表,加上格式字符串是错误的,因为它不包含打印该参数的指令。

进行这些更改后,我们最终结果:

-module(e).
-export([even_print/1]).

even_print([])-> [];
even_print([H|T]) when H rem 2 /= 0 ->
    even_print(T);
even_print([H|T]) ->
    io:format("printing: ~p~n", [H]),
    [H|even_print(T)].

如果我们在Erlang shell中运行它,我们得到:

3> e:even_print(lists:seq(1,10)).
printing: 2
printing: 4
printing: 6
printing: 8
printing: 10
[2,4,6,8,10]

如果您不想打印,只需删除io:format/2来电。

答案 1 :(得分:1)

这是一种方法:

even_print([])-> ok;
even_print([H|T]) when H rem 2 /= 0 -> even_print(T);
even_print([H|T]) when H rem 2 == 0 ->  
     io:format("printing: ~p~n", [H]),
     even_print(T).

在我的Erlang shell中输出:

31> c(main).
{ok,main}
32> main:even_print([1,2,3,4,5,6]).
printing: 2
printing: 4
printing: 6
ok
33>