如何使用递归函数列出erlang中的偶数?

时间:2016-03-16 11:06:53

标签: recursion erlang

如何使用Erlang中的递归函数以这种方式生成偶数。

注意:输出列表的长度是函数func

的输入

示例:

> mod:func(5).
[2,4,6,8,10]

4 个答案:

答案 0 :(得分:5)

在erlang中有很多方法可以做到这一点,我建议:

  1. 使用序列生成器

    doubles(Number)->
        lists:seq(2,Number*2,2).
    
  2. 列表推导

    doubles(Number)->
        [X*2 || X <- lists:seq(1,Number)].
    
  3. 递归方式

    doubles(Max)->
        doubles(1,Max).
    doubles(Max,Max)->
        [Max*2];
    doubles(Val,Max)->
        [Val*2]++doubles2(Val+1,Max).
    

答案 1 :(得分:1)

这是一个示例模块:

-module(even_numbers).   
-export([get_first_n/1]).   

get_first_n(Count) -> 
  get_first_n(Count, 2). 

get_first_n(1, Current) -> 
  [Current]; 

get_first_n(Count, Current) ->
  [Current] ++ f(Count - 1, Current + 2).

答案 2 :(得分:1)

有一种简单而自然的Erlangish方式:

func(N) when is_integer(N) ->
    func(2, N).

func(X, N) when N > 0 ->
    [X | func(X+2, N-1)];
func(_, _) -> [].

答案 3 :(得分:1)

对我来说,尾递归的方式是更自然的Erlang方式:

func(N) when is_integer(N) andalso (N >= 0) ->
  func(N, 1, []).

func(0, _, Acc) ->
  lists:reverse(Acc);
func(N, I, Acc) ->
  func(N - 1, I + 1, [I*2|Acc]).