-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?
4 Réponses :
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.
(N * (N + 1)) div 2 aura raison ... [ mathcentral.uregina.ca/qq/database/qq.02.06/jo1.html]
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). 15Dans 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 appelezsum / 1
avec un nombre négatif, vous obtiendrez une erreurfunction_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.
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).
Exemple simple d'une ligne avec l'utilisation des fonctions Erlang:
sum(N) -> lists:sum(lists:seq(1, N)).