Erlang 如何得到一个数字的和,使和(4)等于1+;2+;3+;4.

Erlang 如何得到一个数字的和,使和(4)等于1+;2+;3+;4.,erlang,erlang-shell,Erlang,Erlang Shell,这就是我到目前为止所做的,尽管它只对列表中的数字求和,比如test:sum([1,2,3,4]) 但是我希望它像test:sum(4)那样输出1+2…+n 如何执行此操作?您提供的此函数将对列表中的值求和,但如果您希望“重载”此函数以同时支持整数,则可以编写: -模块(测试)。 -出口([sum/1])。 总和([])->0; 总和([X|Xs])->X+总和(Xs); 和(0)->0; 当是_整数(N)->(N*(N+1))div2时,求和(N)。 这将使用模式匹配来检查参数的类型,然后选择

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

但是我希望它像test:sum(4)那样输出1+2…+n


如何执行此操作?

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

-模块(测试)。
-出口([sum/1])。
总和([])->0;
总和([X|Xs])->X+总和(Xs);
和(0)->0;
当是_整数(N)->(N*(N+1))div2时,求和(N)。
这将使用模式匹配来检查参数的类型,然后选择要计算的函数的适当“版本”

但我希望它能像测试一样:sum(4)将输出1+2…+n

下面是一个递归解决方案:

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

sum([]) -> 0;
sum([X|Xs]) -> X + sum(Xs) 
在外壳中:

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

sum(0) ->
    0;
sum(X) ->
    X + sum(X-1).
请注意,如果您使用负数调用
sum/1
sum/1
将永远递归,并最终使shell崩溃,因此您可以添加一个保护以仅接受正数。然后,如果使用负数调用
sum/1
,则会得到一个
function_子句
错误,该错误出现在:计算函数调用时未找到匹配的function子句。当然,您还可以定义另一个函数子句来处理负数。

使用尾部递归 代码如下:

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

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

sum(N)->列表:sum(列表:seq(1,N))。
(N*(N+1))第2部分将正确。。。[
% function entry
sum(N) -> sum(N,0);

sum(0,Acc) -> Acc;
sum(N,Acc) -> sum(N-1,Acc+N).