【问题标题】:Print each element from a list in Erlang打印 Erlang 列表中的每个元素
【发布时间】:2015-12-16 00:28:56
【问题描述】:

我创建了一个函数,它将检查给定列表中是否有任何偶数,然后将偶数收集到一个列表中。但是,我被困在我想在新行中从该列表中打印出每个偶数的地方。

这是我的代码 sn-p:

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).

我在想也许是列表推导,但我也想尝试不使用列表推导。

【问题讨论】:

    标签: list erlang


    【解决方案1】:

    您非常接近,但这里有几个可疑的函数子句:

    • 不需要带有[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 调用即可。

    【讨论】:

    • 比我更好的答案,我已经很久没有做 Erlang 了;)
    • 一个问题,在您的代码中,您在最后一行使用[H|even_print(T)].,而我使用even_print(T). - 我不确定我是否遗漏了我的版本中的重要内容?
    • 哦,很好的答案!是的,当我看它时,第二个子句是如此不必要,我必须。 Erlang 真是一门聪明的语言!并感谢伟大的提示也。我学会了。
    • @jpw 嘿,我不认为你错过了什么。在他的版本中,他输入了[H|even_print(T)],因此它会在仅打印出偶数后打印整个偶数列表,而您的只会逐行打印出偶数。就是这样
    • 对,问题是它想要打印数字并在列表中返回它们,所以这就是我的解决方案。
    【解决方案2】:

    这是一种方法:

    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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-09
      • 2016-02-19
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-28
      • 2011-06-15
      相关资源
      最近更新 更多