J'écris une fonction Erlang qui imprime tous les nombres pairs jusqu'à un paramètre donné.
Jusqu'à présent, j'ai écrit la fonction avec des gardes comme celui-ci: P>
printEven(I,N) when I < N ->
if
I rem 2 == 0 -> io:format("~p~n",[I]), printEven(I+1,N);
I rem 2 == 1 -> printEven(I+1,N)
end;
printEven(I,N) ->
io:format("Done").
6 Réponses :
Je crois que le mot clé est " ok code>" p>
Retournez un atome. p>
printempsven (i, n) -> fait. P>
devrait le faire. P>
Je ne veux pas d'imprimer un atome, juste les chiffres dans le texte.
Un atome n'imprime pas. Il va juste arrêter la boucle.
Je devrais clarifier, vous devriez remarquer que la valeur de retour de PrintEven n'est jamais utilisée, vous pouvez donc le renvoyer tout ce qui n'inclut pas un appel récursif.
Sortie toujours effectué code> pour moi dans la coquille. Le shell affiche les valeurs de retour de toutes les fonctions que vous appelez.
Vous pouvez également combiner le test pour même dans la clause Guard. Je préfère également le truc Atom fait - il montre dans votre code que c'est la clause de fonction qui arrêtera la "récursivité".
printEven(I, N) when I<N, I rem 2 == 0 ->
io:format("~p is even~n", [I]),
printEven(I+1, N);
printEven(I,N) when I<N ->
printEven(I+1, N);
printEven(I,N) ->
done.
Y a-t-il un moyen de sortir silencieusement? Sans atome?
Non - toutes les fonctions renvoient une valeur. Vous ne testez pas la valeur de la fonction, donc je ne sais pas pourquoi cela compte pour vous?
OK, définissez d'abord la fonction:
ok = funky(99),
En fait, ce code n'est pas assez joli, la deuxième clause doit être écrite comme suit: PrintEven (I, N) -> _ = si je rem 2 == 0 -> io: format ("~ p ~ n", [i]) ; I REM 2 == 1 -> OK% Imprimer Rien Fin fin, PrintEvent (I + 1, N); N'oubliez pas que la clause IF renvoie une valeur - vous ne le feriez probablement pas dans ce cas, mais je suis resté coincé dans le match pour vous rappeler que cela fait :)
Non seulement pouvez-vous rendre les choses plus jolies en évitant de devoir écrire deux fois l'appel de la fonction récursive, vous pouvez rendre les choses plus jolies en évitant de devoir écrire i rem 2 code> deux fois avec une déclaration de cas. Voir ma réponse.
printEven(1, 3) => ok
^
|
printEven(2, 3) => ok
^
|
printEven(3, 3) => ok
^
|
printEven(4, 3) => ok
Cela le ferait:
printEven(I,N) -> ok.
Umm, ce code ne peut pas compiler - la première clause devrait se terminer par un demi-cône et non un arrêt complet. L'exécutez-vous dans la coquille? Si vous êtes alors, il imprimera toujours ce qu'il revient et cela revient toujours quelque chose. Si vous ne l'exécutez pas dans la coquille, laissez tomber le format IO: Format ...