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) プロセスを 2 つのプロセスに分割し、1 つが fib(N-2) を計算し、もう 1 つが calc を計算することです。fib(N-1)と同時にfib(N)=fib(N-1)+fib(N-2)。前のコードを実行しても何も起こらず、有限ループのようにカーソルが停止するか、結果が到着しないのを待っています。
plzzz 私は助けが必要です 私は新しい Erlang プログラマーです。よろしくお願いします :)

4

2 に答える 2

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.

重要なのは、回答を待つ前に両方のリクエストを送信することです。もちろん、答えを待つ部分はもっと美しい方法で行うことができます。

于 2009-11-08T22:37:29.467 に答える
5

conFib で整数を送信しますが、rpc でタプルを待ちます。次のように変更する必要があります。

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

after受信でtimeout を使用することで、このような状況を回避できます。

于 2009-11-08T22:03:14.600 に答える