2
votes

Comment avoir une somme de nombres pour que la somme (4) fasse 1 + 2 + 3 + 4

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

sum([]) -> 0;
sum([X|Xs]) -> X + sum(Xs) 
This is what I have done so far though it only sums the numbers within a list like test:sum([1,2,3,4])but I want it so that its like test:sum(4) will output 1+2...+nHow can I do this?

0 commentaires

4 Réponses :


5
votes

Cette fonction que vous avez fournie additionnera les valeurs de la liste, mais si vous voulez "surcharger" cette fonction pour qu'elle supporte également les entiers, vous pouvez écrire:

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

Ceci utilise la correspondance de modèle pour vérifier type de l'argument, puis choisissez la «version» appropriée de la fonction à évaluer.


1 commentaires

(N * (N + 1)) div 2 aura raison ... [ mathcentral.uregina.ca/qq/database/qq.02.06/jo1.html]



1
votes

mais je veux que ce soit comme test: sum (4) affichera 1 + 2 ... + n

Voici une solution récursive:

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

Dans le shell:

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

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

Notez que si vous appelez sum / 1 avec un nombre négatif, sum / 1 reviendra pour toujours et finira par planter le shell, vous pouvez donc ajouter une garde pour n'accepter que des nombres positifs. Ensuite, si vous appelez sum / 1 avec un nombre négatif, vous obtiendrez une erreur function_clause à la place, que vous obtenez lorsque: Aucune clause de fonction correspondante n'est trouvée lors de l'évaluation un appel de fonction. Bien sûr, vous pouvez également définir une autre clause de fonction qui gérera les nombres négatifs.


0 commentaires

1
votes

en utilisant la récursivité de queue voici le code ci-dessous:

% function entry
sum(N) -> sum(N,0);

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


0 commentaires

1
votes

Exemple simple d'une ligne avec l'utilisation des fonctions Erlang:

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


0 commentaires