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程序員,在此先感謝:)爲什麼這個erlang代碼不起作用?
不知道你的意圖是用這段代碼,但注意X和Y不是並行計算的。 – Zed 2009-11-08 22:11:48
我想並行計算X和Y,這是我的意圖。 – Fuzzix 2009-11-08 22:32:08
現在您的呼叫流程基本上是send-to-1,receive-from-1,send-to-2,recive-from-2,其中receive是您的代碼塊。您應該將其更改爲發送至1,發送至2,接收1,接收2。 – Zed 2009-11-08 22:34:32