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