В рамках программы изучения Erlang я делаю упражнения из книги «Erlang programming» Франческо Чезарини и Саймона Томпсона. Оказалось что это на редкость полезное занятие, – теперь синтаксис не кажется таким уж страшным, и решение хоть и простых, но практических задач, придает уверенности в себе. Ниже я приведу условия задачи (уж простите, без перевода) и свой вариант решения (зачастую не оптимальный).
Exercise 3-1: Evaluating Expressions
Write a function sum/1which, given a positive integer N, will return the sum of all the integers between 1 and N.
Example: sum(5) ⇒ 15.
Write a function sum/2which, given two integers N and M, where N =< M, will return
the sum of the interval between N and M. If N > M, you want your process to terminate
abnormally.
Example:
sum(1,3) ⇒ 6.
sum(6,6) ⇒ 6.
-module(test3_1).
-export([start/0]).
-import(io).
-import(lists).
listCreate(L, Start, End) ->
if
Start < End -> listCreate(L ++ [End], Start, End - 1);
true -> L
end.
sum(N) ->
%Res = listCreate([], 0, N),
%io:format("~w~n", [Res]),
lists:sum(listCreate([], 0, N)).
sum(Start, End) ->
lists:sum(listCreate([], Start, End)).
start() ->
io:format("~w~n~w~n", [sum(5), sum(1,3)]).
Exercise 3-2: Creating Lists
Write a function that returns a list of the format [1,2,..,N-1,N].
Example:
create(3) ⇒ [1,2,3].
Write a function that returns a list of the format [N, N-1,..,2,1].
Example:
reverse_create(3) ⇒ [3,2,1].
-module(test3_2). -export([start/0]). create(List, 0) -> List; create(List, N) -> create(List ++ [N], N - 1). create(N) -> create([], N). start() -> create(3).
Exercise 3-3: Side Effects
Write a function that prints out the integers between 1 and N.
Hint: use io:format(“Number:~p~n”,[N]).
Write a function that prints out the even integers between 1 and N.
Hint: use guards.
-module (test3_3).
-import (io).
-export ([start/0]).
% implementation with if
print(Max, Cur) ->
NewCur = Cur + 1,
if
Max > Cur ->
io:format("Number:~p~n",[NewCur]),
print(Max, NewCur);
true -> io:format("Number:~p~n",[NewCur])
end.
print(Max) ->
print(Max - 1, 0).
% implementation with guard
print1(Max, Min) when Max > Min ->
NewCur = Min + 1,
io:format("Number:~p~n",[NewCur]),
print1(Max, NewCur);
print1(_, _) -> false.
print1(Max) ->
print1(Max, 0).
start() ->
% print(3).
print1(3).