Process 为什么';这个erlang代码不能工作吗? fib(N)-> P1=繁殖(乐趣:确认/0), P2=繁殖(有趣的concFib:conFib/0), X=rpc(P1,N-2),Y=rpc(P2,N-1),X+Y。 conFib()-> 接收 {Client,N}->Client!regfib(N) 结束。 rpc(Pid,请求)-> 案例erlang: 正确->开始 Pid!{self(),Request}, 接收 {Pid,Respond}->Respond 结束 结束; false->io:format(“~w进程已死亡。”,[Pid]) 结束。 regfib(N)-> 病例n1; false->regfib(N,1,1,1) 结束。 regfib(N,N,X)->X; regfib(N,M,X,Y)->regfib(N,M+1,X+Y,X)。

Process 为什么';这个erlang代码不能工作吗? fib(N)-> P1=繁殖(乐趣:确认/0), P2=繁殖(有趣的concFib:conFib/0), X=rpc(P1,N-2),Y=rpc(P2,N-1),X+Y。 conFib()-> 接收 {Client,N}->Client!regfib(N) 结束。 rpc(Pid,请求)-> 案例erlang: 正确->开始 Pid!{self(),Request}, 接收 {Pid,Respond}->Respond 结束 结束; false->io:format(“~w进程已死亡。”,[Pid]) 结束。 regfib(N)-> 病例n1; false->regfib(N,1,1,1) 结束。 regfib(N,N,X)->X; regfib(N,M,X,Y)->regfib(N,M+1,X+Y,X)。,process,erlang,concurrent-programming,Process,Erlang,Concurrent Programming,其思想是将fib(N)过程分为两个过程:一个计算fib(N-2),另一个计算fib(N-1),同时计算fib(N)=fib(N-1)+fib(N-2)。当我运行前面的代码时,什么也没有发生,光标停止在有限循环中,或者等待未到达的结果。 plzzz我需要帮助我是一名新的Erlang程序员,提前谢谢:)在您的conFib中,您发送一个整数,但等待rpc中的元组。应将其更改为: fib(N)-> P1 = spawn(fun concFib:conFib/0), P2

其思想是将fib(N)过程分为两个过程:一个计算fib(N-2),另一个计算fib(N-1),同时计算fib(N)=fib(N-1)+fib(N-2)。当我运行前面的代码时,什么也没有发生,光标停止在有限循环中,或者等待未到达的结果。

plzzz我需要帮助我是一名新的Erlang程序员,提前谢谢:)

在您的conFib中,您发送一个整数,但等待rpc中的元组。应将其更改为:

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).

您可以在接收中使用timeout with
after
来避免这种情况。

要使计算并行,您可以执行以下操作:

conFib()->
       receive
               {Client,N} -> Client ! {self(), regfib(N)}
       end.
重要的一点是,在等待答案之前,您要发送这两个请求。
等待答案的部分当然可以用一种更漂亮的方式来完成。

不确定您使用此代码的目的是什么,但请注意,X和Y不是并行计算的。我想并行计算X和Y,这是我的目的。现在您的呼叫流基本上是发送到1、接收到1、发送到2、接收到2,在这里,我们将生成代码块。您应该将其更改为发送到1、发送到2、接收到1、接收到2。您能告诉我在哪里可以找到更多的erlang实用Qs吗???谢谢Zed:),它解决了问题,但代码的逻辑并不像我预期的那样工作:(.X=rpc(P1,N-2)和X=rpc(P2,N-1)不要同时工作第二个等待第一个完成。我想在不同的过程中同时计算fib(N-1)和fib(N-2)。我需要更多的帮助…谢谢Rickard:)…我明白了…请原谅,你的答案对我来说更具体,把Q放在第一位。
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.