如何具有数字和,以便sum(4)可以做1 + 2 + 3 + 4

时间:2019-03-07 14:04:59

标签: erlang erlang-shell

-module(test).
-export([sum/1]).

sum([]) -> 0;
sum([X|Xs]) -> X + sum(Xs) 

这是我到目前为止所做的,尽管它只对test:sum([1,2,3,4])之类的列表中的数字求和。

但是我想要它,以便像test:sum(4)那样输出1 + 2 ... + n

我该怎么做?

4 个答案:

答案 0 :(得分:3)

您提供的此函数将对列表中的值求和,但是如果您要“重载”此函数以也支持整数,则可以编写:

-module(test).
-export([sum/1]).

sum([]) -> 0;
sum([X|Xs]) -> X + sum(Xs);

sum(0) -> 0;
sum(N) when is_integer(N) -> (N * (N + 1)) div 2.

这使用模式匹配来检查参数的类型,然后选择要评估的函数的正确“版本”。

答案 1 :(得分:1)

使用尾递归 这是下面的代码:

case

答案 2 :(得分:1)

使用Erlang函数的简单一行示例:

sum(N) -> lists:sum(lists:seq(1, N)).

答案 3 :(得分:0)

  

但是我想要它,以便它像test:sum(4)会输出1 + 2 ... + n

这是一个递归解决方案:

-module(my).
-compile(export_all).

sum(0) ->
    0;
sum(X) ->
    X + sum(X-1).

在外壳中:

3> my:sum(1).
1
4> my:sum(2).
3
5> my:sum(3).
6
6> my:sum(4).
10
7> my:sum(5).
15

请注意,如果用负数调用sum/1,则sum/1将永远递归并最终使Shell崩溃,因此您可以添加防护以仅接受正数。然后,如果用负数调用sum/1,则会收到一个function_clause错误,该错误将在以下情况下出现:在评估函数调用时找不到匹配的函数子句。当然,您也可以定义另一个处理负数的函数子句。