Как получить сумму чисел, чтобы сумма (4) делала 1 + 2 + 3 + 4 - PullRequest
0 голосов
/ 07 марта 2019
-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

Как я могу это сделать?

Ответы [ 2 ]

3 голосов
/ 07 марта 2019

Эта функция, которую вы предоставили, будет суммировать значения в списке, но если вы хотите "перегрузить" эту функцию, чтобы она также поддерживала целые числа, вы можете написать:

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

При этом используется сопоставление с образцом для проверки типааргумент, а затем выберите правильную «версию» функции для оценки.

0 голосов
/ 08 марта 2019

но я хочу, чтобы это было похоже на тест: 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 будет повторяться вечно и в конечном итоге приведет к аварийному завершению оболочки, поэтому вы можете добавить охрану, который будет принимать только положительные числа. Затем, если вы позвоните по номеру sum/1 с отрицательным числом, вместо этого вы получите ошибку function_clause, которую вы получите, когда: При оценке вызова функции не найдено соответствующее функциональное предложение. Конечно, вы можете также определите другое предложение функции, которое будет обрабатывать отрицательные числа.

...