【发布时间】:2010-12-14 10:53:19
【问题描述】:
fib(N)->
P1 = spawn(fun concFib:conFib/0),
P2 = spawn(fun concFib:conFib/0),
X=rpc(P1,N-2),Y=rpc(P2,N-1),X+Y.
conFib()->
receive
{Client,N} -> Client ! regfib(N)
end.
rpc(Pid,Request)->
case erlang:is_process_alive(Pid) of
true -> begin
Pid ! {self(),Request},
receive
{Pid,Respond} -> Respond
end
end;
false -> io:format("~w process is dead.",[Pid])
end.
regfib(N)->
case N<2 of
true -> 1;
false -> regfib(N,1,1,1)
end.
regfib(N,N,X,_)-> X ;
regfib(N,M,X,Y)-> regfib(N,M+1,X+Y,X).
这个想法是将fib(N)进程分为两个进程,一个计算fib(N-2),另一个计算。 fib(N-1) 同时为 fib(N)=fib(N-1)+fib(N-2)。当我运行前面的代码时,什么也没有发生,并且光标在有限循环中停止或等待未到达的结果。
plzzz我需要帮助我是一个新的Erlang程序员,在此先感谢:)
【问题讨论】:
-
不确定您对这段代码的意图是什么,但请注意 X 和 Y 不是并行计算的。
-
我想并行计算X和Y,这是我的意图。
-
现在您的呼叫流程基本上是 send-to-1、receive-from-1、send-to-2、recive-from-2,receive 使您的代码块。您应该将其更改为 send-to-1、send-to-2、receive-from-1、receive-from-2。
-
你能告诉我在哪里可以找到更多的 erlang 实用 Qs???
标签: process erlang concurrent-programming