您的位置:首页 > 其它

erlang每日练手--4

2014-05-10 10:01 232 查看
-module(daily_four).

-export([echo/0]).
-export([start1/0, start2/0]).
-export([procRing/3]).
-export([binary_search/2]).

%% ==========================================================
%% 简单的消息响应服务器
%% ==========================================================
echo()	->
register(echo, spawn(fun() -> loop() end)).

loop()	->
receive
stop ->
io:format("echo server closed!~n");
Msg	->
io:format("echo server received:~p~n", [Msg]),
loop()
end.

print(Msg)	->	echo ! Msg.

stop()	->	echo ! stop.

%% ===================================================
%% 编译时会报警告,调用时不会输出任何信息
%% ===================================================
% start() -> spawn(fun() -> loop() end).

% loop() ->
% 	receive
% 		{rectangle, Width, Height}	->
% 			Width*Height;
% 		{circle, Radius}	->
% 			3.14 * Radius * Radius
% 	end,
% 	loop().

%% ===================================================
%% 调用时会输出消息本身
%% 输入:
%%	Pid = demo2:start1().
%%	Pid ! {circle, 5}.
%% 输出:
%%	Result:78.5
%%	{circle, 5}
%% ===================================================
start1() -> spawn(fun() -> loop1() end).

loop1() ->
receive
{rectangle, Width, Height}	->
io:format("Result:~p~n", [Width*Height]);
{circle, Radius}	->
io:format("Result:~p~n", [3.14 * Radius * Radius])
end,
loop1().

%% ===================================================
%% 调用时不会输出消息本身
%% 输入:
%%	Pid = demo2:start2().
%%	demo2:rpc(Pid, {circle, 5}).
%% 输出:
%%	78.5
%% 说明:
%% 不太清楚为什么这里就不输出信息本身??????
%% ===================================================
start2() -> spawn(fun() -> loop2() end).

rpc(Pid, Request)	->		%% 此函数的作用仅仅只是为了调用loop函数时传递From参数
Pid ! {self(), Request},
receive
Response	-> Response
end.

loop2()	->
receive
{From, {rectangle, Width, Height}}	->
From ! Width * Height;
{From, {circle, Radio}}	->
From ! 3.14 * Radio * Radio;
{From, Other}	->
From ! {error, Other}
end,
loop2().

%% =====================================================
%% 进程环
%% 创建ProcNum个进程,这ProcNum个进程组成一个进程环,然后将Message沿着进程环传送SendNum次
%% =====================================================
procRing(ProcNum, SendNum, Message)	->
processes(ProcNum, ProcNum),
io:format("==========================================~n"),
sendMessage(1, SendNum, Message, ProcNum).

processes(N, Max)	->
for(N, fun(X) -> genProcess(X, Max) end).

for(1, F)	-> [F(1)];
for(N, F)	-> [F(N) | for(N - 1, F)].

genProcess(N, Max)	->
ProN = genAtom(N),
register(ProN, spawn(fun() -> loopRing(Max) end)),
io:format("Process [~p:~p] was created successfully!~n", [ProN, whereis(ProN)]).

% process name
genAtom(N)	->
L = lists:concat([proc_, N]),
list_to_atom(L).

loopRing(Max)	->
receive
die ->	quit;
{From, {X, Y, Z}}	->
io:format("Message [~p] from (~p) to (~p)~n", [Z, From, self()]),
sendMessage(X + 1, Y, Z, Max),
loopRing(Max);
Other	->
io:format("Other:~p~n", [Other])
end.

sendMessage(CurProcIndex, SendNum, Message, MaxProcIndex)	->
if
CurProcIndex =:= 1 ->					% 如果是第一次发,则必须从最后面一个进程发送到第一个进程
Pid1 = whereis(genAtom(MaxProcIndex)),
Pid2 = whereis(genAtom(CurProcIndex));
CurProcIndex =/= 1 ->					% 如果不是第一次发,则是前一个进程发送到当前进程
Pid1 = whereis(genAtom(CurProcIndex - 1)),
Pid2 = whereis(genAtom(CurProcIndex))
end,
if
SendNum =:= 0 ->
quit;
SendNum =/= 0 ->
Pid2 ! {Pid1, {CurProcIndex, SendNum - 1, Message}}
end.

%% ======================================================
%% binary search
%% ======================================================
binary_search(N, L) -> do_search(N, L).

do_search(N, [])	->
io:format("~p is not exist in list~n",
);
do_search(N, L)	->
MidValue = mid_value(L),
if
MidValue =:= N ->
io:format("Successfully,~n");
MidValue > N	->
HalfList = [X || X <- L, X < MidValue],
do_search(N, HalfList);
MidValue < N 	->
HalfList = [X || X <- L, X > MidValue],
do_search(N, HalfList)
end.

% 获取列表长度
len([])	-> 0;
len([_H|T])	-> 1 + len(T).

% 获取列表中指定序号的项
get(1, [H|_T])	-> H;
get(N, [_H|T])	-> get(N - 1, T).

% 获取列表中中间位置的项
mid_value(L)	->
Len = len(L),
Index = Len div 2,
if
Index =:= 0	->
get(1, L);
Index =/= 0	->
get(Index, L)
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: