2009-11-08 488 views
2
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代碼不起作用?

+1

不知道你的意圖是用這段代碼,但注意X和Y不是並行計算的。 – Zed 2009-11-08 22:11:48

+0

我想並行計算X和Y,這是我的意圖。 – Fuzzix 2009-11-08 22:32:08

+0

現在您的呼叫流程基本上是send-to-1,receive-from-1,send-to-2,recive-from-2,其中receive是您的代碼塊。您應該將其更改爲發送至1,發送至2,接收1,接收2。 – Zed 2009-11-08 22:34:32

回答

5

在您的conFib中發送一個整數,但在rpc中等待一個元組。應將其更改爲:

conFib()-> 
     receive 
       {Client,N} -> Client ! {self(), regfib(N)} 
     end. 

您可以通過在接收使用超時與after規避此類情況。

+0

Thanks Zed :),它解決了這個問題,但是代碼的邏輯並不如我所期望的那樣工作:(。 X = rpc(P1,N-2)和X = rpc(P2,N-1)同時工作第二個等待第一個要完成 我想計算fib(N-1)和fib(N-2)在同一時間在不同的過程中的每一個。 我wana更多的幫助plz ... – Fuzzix 2009-11-08 22:25:44

5

爲了使計算平行,你可以這樣做:

fib(N)-> 
     P1 = spawn(fun test:conFib/0), 
     P2 = spawn(fun test:conFib/0), 
     P1 ! {self(), N - 2}, 
     P2 ! {self(), N - 1}, 
     receive 
     {_, R1} -> R1 
     end, 
     receive 
     {_, R2} -> R2 
     end, 
     R1 + R2. 

的重要組成部分,是你在等待的答案之前,同時發送的請求。 等待答案的部分當然可以以更美麗的方式完成。

+0

謝謝Rickard:)...我知道了..原諒我,你的答案對我更具體,把Q當成Zed先回答。 – Fuzzix 2009-11-08 22:50:47

相關問題