-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
我该怎么做?
答案 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
错误,该错误将在以下情况下出现:在评估函数调用时找不到匹配的函数子句。当然,您也可以定义另一个处理负数的函数子句。